Думайте о сущностях так же, как о таблице в базе данных.Если Item является сущностью, то он должен соответствовать таблице в базе данных.Вы указали, что первичным ключом для «Item» является сущность Product.Это все равно что пытаться настроить таблицу Item с PK на таблицу Product.Не работает таким образом.
Если Item совместно использует PK с Product, т.е. productId, то сущность Item также нуждается в свойстве productId, чтобы установить свой атрибут [Key].Элемент также может иметь свойство Product, которое отображается как 1-к-1, используя этот productId в качестве FK.
Например:
public class Item
{
[Key]
[ForeignKey("idProduct")]
public string productId { get; set; }
public virtual Product idProduct { get; set; }
}
Чтобы извлечь элемент по идентификатору продукта:
var item = itemDal.items.SingleOrDefault(x => x.productId == id);
Для включения сведений о продукте:
var item = itemDal.items.Include(x => x.idProduct).SingleOrDefault(x => x.productId == id);
Если у элемента есть собственный ключ (itemId), определите его как [Key] и сохраните productId как внешний.ключ.Это устанавливает отношение многих к 1.(многие товары могут ссылаться на один и тот же товар)
public class Item
{
[Key]
public string itemId { get; set; }
[ForeignKey("idProduct")]
public string productId { get; set; }
public virtual Product idProduct { get; set; }
}
Затем получить первый (произвольный) товар для товара:
var item = itemDal.items.FirstOrDefault(x => x.productId == id);
// or...
var item = itemDal.items.FirstOrDefault(x => x.idProduct.productId == id);
В этом случае вы можете настроить связь между товароми Product без использования productId в объекте item с использованием явного сопоставления (EF6) или свойства shadow (EF Core), но вы можете прочитать об этом подробнее.
Это хорошо, если вы просто хотите получить информацию отданные.Если вы хотите вернуть данные в представление или что-либо подобное вне области действия DbContext (itemDal), то лучше всего использовать .Select()
для заполнения простого класса только необходимыми деталями, а не просто / лениво загружать целые объекты,Как правило, не пропускайте сущности за пределы их DbContext (т. Е. Блока using()
для контекста), так как это будет иметь последствия для отложенной загрузки.Объекты также создают проблемы для сериализаторов, такие как попытки вернуть их из действий контроллера MVC для представлений.Преимущество использования .Select()
заключается в том, что вам не нужно беспокоиться о явном использовании .Include()
для доступа к связанным данным.Он обеспечивает повышение производительности, поскольку уменьшает объем данных для загрузки и передачи, а также ограничивает информацию о вашей схеме, которая отправляется пользователю / потребителю.