我正在使用EF CodeFirst
方法很长时间。这就是我用来定义一对多关系的方式。
//one Customer can have many products --> One to Many relationship.
public class Customer
{
[Key]
public int CustId { get; set; }
public string CustName { get; set; }
public virtual List<Product> Products { get; set; }
}
public class Product
{
[Key]
public int ProdId { get; set; }
public string BuyDate { get; set; }
[ForeignKey("Customer")]
public int CustomerId { get; set; }
public virtual Customer Customer { get; set; }
}
但最近在一次讨论中,我才知道这不是最好的方法。我可以通过这种方式定义此类关系,而无需在产品实体中public int CustomerId { get; set; }
的开销。
我该怎么做?
答案 0 :(得分:1)
当你将关系定义如下时,它应该足以在产品和客户之间建立一对多的关系
public class Customer
{
//other properties omitted
public virtual ICollection<Product> Products { get; set; }
}
public class Product
{
//other properties omitted
[ForeignKey("Customer")]
public int CustomerId { get; set; }
public virtual Customer Customer { get; set; }
}
在EF中,您可以通过以下方式设置此关系(对于新产品):
var customer = context.Customers.GetById(1);
var myProduct = new Product()
{
//set all the properties
}
customer.Products.Add(myProduct);
context.SaveChanges();
当您使用EF加载产品时,只需导航到该客户即可访问该客户(及其所有属性):
string name = myProduct.Customer.CustName;
int custId = myProduct.Customer.Id;
请注意,查询产品dbset并查看customerId会导致生成的SQL执行与customers表的连接,这会对性能产生负面影响。
我发现你的榜样不是一个糟糕的解决方案。我认为在某些情况下,将CustomerId包含在模型中是有意义的(无论如何,它都是由EF创建的,以创建关系)。
答案 1 :(得分:0)
只需忽略CustomerId
中的Product
媒体资源,并将Customer
中的主键重命名为CustomerId
。