2013-04-05 3 views
1

У меня есть феллинг модель в моем проекте (EF5, DbContext, базы данных первого):Свойства навигации к той же таблице

клиента

InvoiceAddress -> Addresses (table) 
DeliveryAddress -> Addresses (table) 

Так я имею 2 внешних ключей в одной и той же таблицы ,

Когда я загружаю объект клиента, используя следующее заявление:

var cst = ctx.Customers.Where(c => c.CustomerID == 2).SingleOrDefault(); 
    ctx.Entry(cst).Reference(c => c.InvoiceAddress).Load(); 

После загрузки ссылки на InvoiceAddress, то DeliveryAddress также загружаются. Однако это происходит только тогда, когда счет-фактура и идентификатор доставки одинаковы. Когда они не равны, DeliveryAddress не загружается. Что вызывает такое поведение?

ответ

1

Вот догадка:

Когда вы охотно ссылаться на объект, вы SELECT сразу ИНГ его. Когда вы получаете свои данные, менеджер объектов создает объекты в смысле EF. Поскольку DeliveryAddress и InvoiceAddress фактически представляют собой один и тот же объект (тот же PK, если у вас есть составной ключ, он должен быть одним и тем же составным ключом), он использует один и тот же экземпляр для представления обоих из них, что также означает, что оба адреса загрузиться - потому что почему нет? Это точно тот же объект, данные указывают на ту же строку в БД. Ссылки разделяются и используются меньше памяти.

Если ПК отличаются друг от друга, то счет-фактура и доставка адресов представлены различными объектами, загрузка одной из них не повлияет на другую.

+0

Что вы зовёте? Тем не менее, я определил два разных внешних ключа в базе данных, а также есть два ключа в модели сущности. Когда я пытаюсь изменить значение адреса доставки, тогда возникает этот результат: «Нарушение ограничения ссылочной целостности произошло» – NRonald

+0

@ Клавиши NRonald являются отдельными, но в конце они указывают на одни и те же данные. Исключением, которое вы указали, объясняется [здесь] (http://stackoverflow.com/a/11596430/1180426) и [здесь] (http://stackoverflow.com/a/12977804/1180426), без дальнейших подробностей трудно действительно знаю, что происходит ... –

+0

Можно ли создать «2 разных» конечных точки? Единственное решение, которое я вижу сейчас, это установить для всех свойств навигации значение null перед Save(). – NRonald

Смежные вопросы