В Nh нельзя использовать равенство ссылок для отдельных экземпляров. Это мешает вам использовать NH в клиентах, которые хотели бы использовать это поведение (на мой взгляд, это правильное поведение, NH не зависит от магии!).
В веб-приложениях или сессиях, основанных на сеансах, где вы можете перейти к БД в рамках одной сессии ISession, я думаю, что я прав, говоря, что вы можете положиться на равенство ссылок. Но в сценарии с умным клиентом или, более конкретно, в любом сценарии, в котором две сессии ISessions совместно используют экземпляр (один загружается из или вставляется в базу данных, а затем передается во второй), вам необходимо, чтобы поля (поля) идентификатора базы данных сохранялись вместе с экземпляр.
второй сеанс, приведенный ниже, не предполагал бы, что передаваемый экземпляр уже вставлен и требует обновления, и даже если вы изменили его на обновление, я предполагаю, что я прав, думая, что он не собирается знать идентификатор БД класса.
class SomeEntityWithNoId
{
public blah etc {}
}
class dao
{
void DateMethod()
{
var s1 = sessionFactory.OpenSession();
var instance = new SomeEntityWithNoId();
instance.Blah = "First time, you need to insert";
s1.Save(s1); //now instance is persisted, has a DB ID such as identity or Hilo or whatever
s1.close();
var s2 = sessionFactory.OpenSession();
s2.Blah = "Now update, going to find that pretty hard as the 2nd session won't know what ID to use for the UPDATE statement";
s2.Update(instance); //results in boom! exception, the second session has no idea *how* to update this instance.
}
}
Если вас беспокоят поля (поля) идентификаторов, которые, по вашему мнению, являются правильными, в значительной степени бесполезны для чего-либо, кроме проблем постоянства, вы можете сделать их частными, поэтому по крайней мере это поведение и семантика будут инкапсулированы. Вы можете обнаружить, что этот подход вносит некоторые трения в TDD.
Я думаю, вы правы относительно карт ID, по крайней мере, в отношении NH. Если экземпляр является временным, когда он впервые присоединяется к сеансу, вашему типу не нужно хранить его идентификатор базы данных в поле. Я думаю, что сессия будет знать, как управлять своими отношениями с БД. Я уверен, что вы можете провести тест, чтобы доказать это поведение; p