实体框架 - 如何向db添加复杂对象

时间:2016-12-20 21:15:11

标签: c# mysql entity-framework linq

这是我的MySQL数据库的简化模型(模型优先): enter image description here 我通过Entity Framework v6.1.3映射它。我有dataContext个对象来进行数据库查询。

OrderProductsProduct1是进行外键连接的表,这里是EF自动生成的类:

 public partial class OrderProductsProduct1
 {
     public int ID { get; set; }
     public int OrderProductsID { get; set; }
     public int Product1ID { get; set; }
     public decimal Width { get; set; }

     public virtual OrderProducts OrderProducts { get; set; }
     public virtual Product1 Product1 { get; set; }
}

我很困惑如何将新对象添加到数据库,数据库有两个一对多的外键。例如,如何正确添加Order个对象,其中Product1个对象通过OrderProductsOrderProductsProduct1表连接起来。

到目前为止,我尝试制作List OrderProducts,其中OrderProduct的{​​{1}}另有List OrderProductsProduct1 and 2。至OrderProductsProduct1 and 2我正在添加Products1 and 2。最后,OrderProductsOrder绑定orderProducts.Order = newOrder,然后绑定dataContext.Add(newOrder)。但这会导致实体框架异常。

我是否必须从最低级别(Client,Product1,Product2)创建对象,使用dataContext.Add()将它们添加到数据库中,以获取其ID,然后将它们与更高级别的对象绑定(订单) )等等到最高级别(OrderProductsProduct1和2)?这种方法省略了实体框架,并且在发生错误时很难恢复更改。

1 个答案:

答案 0 :(得分:2)

实体框架非常智能,可以查看对象的主键(ID),看它是否必须将其添加为新对象,或仅使用对象的外键。

假设您要添加具有现有OrderProducts和现有Product1的新OrderProductProducts1。代码可以如下:

Product1 existingProduct = dbContext.Product1s...
OrderProducts existingorderProduct = dbContext.OrderProducts...

使用现有项目ID的方法:

OrderProductProducts1 addedProduct = dbContext.OderProductProducts1.Add(
    new OperProductProducts1()
    {
        // don't fill ID, will be filled during SaveChanges
        OrderProductsId = existingOrderProduct.ID,
        Product1Id = existingProduct.ID,
        ...
    });

您也可以使用完整的现有项目,而不是填写现有项目的ID:

OrderProductProducts1 addedProduct = dbContext.OderProductProducts1.Add(
    new OperProductProducts1()
    {
        // don't fill ID, will be filled during SaveChanges
        OrderProducts = existingOrderProduct,
        Product1 = existingProduct,
        ...
    });

实体框架非常智能,可以检查现有项目的ID,看是否不必添加。

如果您的OrderProductProducts1不使用现有项目,但现在只使用现有项目,只需将它们分配为现有项目:

var nonExistingProduct = new Product1s() {...};
// note: because it does not exist ID == 0
OrderProductProducts1 addedProduct = dbContext.OderProductProducts1.Add(
    new OperProductProducts1()
    {
        // don't fill ID, will be filled during SaveChanges
        OrderProductsId = existingOrderProduct.Id,
        Product1 = nonExistingProduct,
        ...
    });

在SaveChanges实体框架中,发现nonExistingProduct的ID为零,因此知道必须添加它。该产品的ID将是国外的Product1Id。

如果需要,可以在添加OrderProductProducts1之前自行将新产品添加到DbContext。但是,请记住,只要您没有SaveChanges,就无法使用ID:

var justAddedProduct = dbContext.Products.Add(new Product1s() {...});
// note: because it does not exist ID == 0
OrderProductProducts1 addedProduct = dbContext.OderProductProducts1.Add(
    new OperProductProducts1()
    {
        // don't fill ID, will be filled during SaveChanges
        OrderProductsId = existingOrderProduct.Id,
        Product1 = justAddedProduct,
        ...
    });