Ссылочная идентичность в структурах постоянства

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

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 для каждой позиции?


person Paul Alexander    schedule 12.06.2009    source источник


Ответы (4)


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

person Shane Courtrille    schedule 12.06.2009

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

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

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

тогда ссылочное равенство не вернет true.

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

person Surya    schedule 12.06.2009

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

person Andrew Siemer    schedule 12.06.2009

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

person Paco    schedule 12.06.2009