这是我的MySQL数据库的简化模型(模型优先):
我通过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
个对象通过OrderProducts
和OrderProductsProduct1
表连接起来。
到目前为止,我尝试制作List
OrderProducts
,其中OrderProduct
的{{1}}另有List
OrderProductsProduct1 and 2
。至OrderProductsProduct1 and 2
我正在添加Products1 and 2
。最后,OrderProducts
与Order
绑定orderProducts.Order = newOrder
,然后绑定dataContext.Add(newOrder)
。但这会导致实体框架异常。
我是否必须从最低级别(Client,Product1,Product2)创建对象,使用dataContext.Add()
将它们添加到数据库中,以获取其ID,然后将它们与更高级别的对象绑定(订单) )等等到最高级别(OrderProductsProduct1和2)?这种方法省略了实体框架,并且在发生错误时很难恢复更改。
答案 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,
...
});