Конфигурация «Многие к одному», использующая сначала код EF 4.1

#ef-code-first #many-to-one

#ef-code-first #»многие к одному»

Вопрос:

У меня есть следующие классы:

 public class CartItem
{
    public long Id { get; set; }
    public int Quantity { get; set; }
    public Product Product { get; set; }
}

public class Product    {
    public long Id { get; set; }
    public string Title { get; set; }
    public decimal Price { get; set; }
}
  

В настоящее время у меня есть следующая конфигурация:

 modelBuilder.Entity<CartItem>().HasRequired(x => x.Product).WithMany().Map(x => x.MapKey("ProductId"));
  

Я пытаюсь гарантировать, что всякий раз, когда я извлекаю cartitem из базы данных, в таблице product будет объединение, чтобы я мог получить доступ к свойствам продукта, но не наоборот.

В принципе, я хочу иметь возможность делать:

 string title = cartItem.Product.Title
  

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

Ответ №1:

Краткий ответ: чтобы решить вашу проблему, создайте Product свойство virtual .

Углубленный:

Во-первых, для этого вам не нужно объединение. EF отлично работает при отложенной загрузке (вам нужен virtual модификатор)

Во-вторых, вы можете быстро получить продукт, используя Include метод расширения. Пример:

 var cartItem = context.CartItems.Include(x => x.Product)
                      .Where(/*some condition*/).ToList();
  

… но вы не можете настроить это как поведение по умолчанию (и обычно это не очень хорошая идея)

В-третьих, это отношение «многие к одному», а не «один к одному» (продукт имеет много связанных заголовков)