如何在代码中编写一对多的关系

时间:2017-03-20 14:52:43

标签: c# asp.net entity-framework ef-code-first one-to-many

我正在使用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; }的开销。

我该怎么做?

2 个答案:

答案 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