具有相关表的实体框架保存模型

时间:2020-08-11 19:33:56

标签: c# entity-framework

所以我的问题基本上与嵌套模型或关联的表有关(不确定正确的术语)。 具体来说,当TableA具有TableB对象的ICollection,而TableB具有TableA的ICollection时,我该如何保存整个TableA模型及其关联的Table2项目。

例如:

  • 用户表,具有:字符串名称,字符串地址,ICollection <订单>

  • 订单表,其中包含:OrderID,总计,发货日期,ICollection <用户>

因此,我有一个User实例(UserA),它具有设置的名称和地址以及一系列订单(比如Bob Dole,1234 Main st,[567,$ 12.34,10月1日; 999,$ 27.89,11月5日; ])。 如何触发保存方法来保存订单和用户? 我的期望是“ db.User.add(UserA); + db.SaveChanges();”。我希望这可以保存用户,并且在看到“订单”集合时也要保存这些。

但是,以前的开发人员是这样做的:

 User userB = db.User.Add(new User(userA.Name, userB.address));     //Why do we have to create a 2nd instance of a User object, that will hold the same information as userA?
 foreach(Order order in userA.orders)
 {
    Order NewOrder = db.Orders.Add(order);  //This now updates the Orders table with new info, which will be saved by 'db.SaveChanges()'
    NewOrder.User.Add(userB);               //How does this update the value in the Orders table with the userID? Isn't this updating the object about to go out of scope?
}
db.SaveChanges()

我们唯一能想到的就是他们通过userAdd从.Add命令中分配ID的方式。但是您不能简单地说“ userA = db.Users.Add(userA)”以便使用插入数据库时​​提供的ID更新实例吗?

1 个答案:

答案 0 :(得分:1)

首先,我认为您必须更改架构。

UserOrders之间将存在一对多的关系。一个用户可以有多个订单,但一个订单不能属于多个用户。即,只有Order个表将具有UserId

更新

此外,无需单独添加Orders数据。就像User表的实体中可用的收集类型一样。

您只需要将值与Orders字段一起分配给User表的实体,并只将其插入一次即可。

代码如下:

var userData = user;
var orderData = orderCollection;

userData将是单个记录,而orderData可能是多个记录。

现在将数据分配给User数据模型:

var userAndOrder = new User
{
    Name = user.Name,
    Address = user.Address,
    Orders = orderCollection.Select(o => new Order
    {
        //assign order fields here
    }).ToList();
};

然后保存该数据。它将根据用户ID将Orders数据本身保存在Order表中。

db.Add(userAndOrder);
db.SaveChanges();
相关问题