问题描述
所以我的问题基本上与嵌套模型或关联的表有关(不确定正确的术语)。 具体来说,当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更新实例吗?
解决方法
首先,我认为您必须更改架构。
User
和Orders
之间将存在一对多的关系。一个用户可以有多个订单,但一个订单不能属于多个用户。即,只有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();