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

问题描述

所以我的问题基本上与嵌套模型或关联的表有关(不确定正确的术语)。 具体来说,当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更新实例吗?

解决方法

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

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();

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...