Я мысленно спорим с собой каждый раз, когда начинаю работать над новым проектом и разрабатываю свои POCO. Я видел много руководств / примеров кода, которые, кажется, отдают предпочтение ассоциациям внешних ключей :
Ассоциация внешнего ключа
public class Order
{
public int ID { get; set; }
public int CustomerID { get; set; } // <-- Customer ID
...
}
В отличие от независимых ассоциаций :
Независимая ассоциация
public class Order
{
public int ID { get; set; }
public Customer Customer { get; set; } // <-- Customer object
...
}
Я работал с NHibernate в прошлом и использовал независимые ассоциации, которые не только ощущаются более объектно ориентированными, но также (с отложенной загрузкой) имеют то преимущество, что дают мне доступ ко всему объекту Customer, а не только к его идентификатору. Это позволяет мне, например, получить экземпляр Order, а затем обойтись Order.Customer.FirstName
без явного соединения, что чрезвычайно удобно.
Итак, мои вопросы таковы:
- Есть ли существенные недостатки в использовании независимых ассоциаций? и...
- Если их нет, зачем вообще использовать ассоциации внешнего ключа?
источник
Используйте оба. И сделайте ссылки на объекты виртуальными, чтобы обеспечить ленивую загрузку. Как это:
Это избавляет от ненужных поисков в БД, допускает отложенную загрузку и позволяет легко увидеть / установить идентификатор, если вы знаете, каким он должен быть. Обратите внимание, что наличие обоих никоим образом не меняет структуру вашей таблицы.
источник
Независимая ассоциация не работает с тем,
AddOrUpdate
что обычно используется вSeed
методе. Когда ссылка является существующим элементом, она будет повторно вставлена.В результате существующий клиент будет повторно вставлен, а новый (повторно вставленный) клиент будет связан с новым заказом.
Если мы не используем ассоциацию внешнего ключа и не присвоим идентификатор.
У нас ожидаемое поведение, существующий клиент будет связан с новым заказом.
источник
var order = new Order { Id = 1, Customer = db.Customers.Find(1) };
Или вы можете использовать метод Select для загрузки клиента из контекста базы данных. Это работает с независимой ассоциацией.Я предпочитаю объектный подход, чтобы избежать ненужных поисков. Объекты свойств могут быть так же легко заполнены, когда вы вызываете свой фабричный метод для построения всей сущности (используя простой код обратного вызова для вложенных сущностей). Я не вижу никаких недостатков, кроме использования памяти (но вы бы правильно кэшировали свои объекты?). Итак, все, что вы делаете, это подменяете кучу стеком и получаете прирост производительности за счет того, что не выполняете поиск. Я надеюсь это имеет смысл.
источник