Ссылочная идентичность в рамках персистентности - PullRequest
1 голос
/ 12 июня 2009

С нашими текущими свойствами каркаса персистентности дочерней сущности, которые указывают на его родителя, всегда указывают на тот же экземпляр. Например, учитывая следующие классы сущностей

public class Order
{
    public int OrderId{get;set;}
    public EntityCollection<LineItem> Items{get;}
}

public class LineItem
{
    public Order Order{ get;set;}
}

Мы можем загрузить заказ из базы данных следующим образом:

var order = Order.FindById( 1000 );

Теперь вот ключ к моему вопросу, следующее верно для нашей текущей структуры

object.ReferenceEquals( order, order.Items[ 0 ].Order );

То есть свойство Order в позиции указывает на точно такой же экземпляр объекта заказа в памяти при доступе через свойство Items.

Я устал от поддержки наших инструментов сущностей и хочу переключиться на NHibernate или другую среду персистентности. У меня такой вопрос: работает ли функция отложенной загрузки NHibernate таким же образом или он загружает новый экземпляр объекта Order для каждой позиции?

Ответы [ 4 ]

2 голосов
/ 12 июня 2009
object.ReferenceEquals( order,order.Items[ 0 ].Order );

Может не всегда быть правдой, это зависит от того, как вы настроили сторону много-к-одному в отображении nihibernate, если вы установите его как ленивый (как показано ниже)

<many-to-one name="order"  lazy="proxy" />

тогда ссылка равно не вернет истину.

Но если вы получите начальный порядок в том же сеансе в предыдущей строке, как вы упомянули, тогда вы могли бы получить реальный объект, а не прокси

2 голосов
/ 12 июня 2009

NHibernate работает таким образом в течение одного сеанса (единицы работы). Есть способы заставить его работать таким образом, выходящим за рамки одного сеанса, используя кэш второго уровня NHibernate. Отличное объяснение этому можно найти здесь Кэширование первого и второго уровня в NHibernate

1 голос
/ 12 июня 2009

Да. Они ссылаются на один и тот же экземпляр! То же самое для LINQ to SQL и Entity Framework.

0 голосов
/ 12 июня 2009

Да, NHibernate использует Identity Map в ISession для управления ссылками на сущности. Другие структуры сохранности делают (или должны делать) то же самое.

...