#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();
… но вы не можете настроить это как поведение по умолчанию (и обычно это не очень хорошая идея)
В-третьих, это отношение «многие к одному», а не «один к одному» (продукт имеет много связанных заголовков)