【问题标题】:Entity Framework-Saving models with related tables实体框架-保存模型与相关表
【发布时间】:2020-08-11 19:33:56
【问题描述】:

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

例如:

  • 用户表有:字符串名称、字符串地址、ICollection

  • Orders 表包含:OrderID、Total、ShipDate、ICollection

所以我有一个用户实例 (UserA),其中设置了名称和地址以及一组订单(假设 Bob Dole,1234 Main st,[567,12.34 美元,10 月 1 日;999,27.89 美元,11 月 5 日; ])。 如何触发保存方法来保存订单和用户? 我的期望是“db.User.add(UserA); + db.SaveChanges();”。我希望这可以保存用户,并在看到 Orders 集合后也保存它们。

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

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

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

【问题讨论】:

  • UserOrder 有模型吗?您正在描述多对多关系。我没有仔细检查,但我认为保存整个事情所需要的只是创建一个新用户并向用户添加新订单,只要你有那个中间表和所有外键设置正确。

标签: c# entity-framework


【解决方案1】:

首先,我认为,你必须改变你的架构。

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

更新

此外,无需单独添加Orders 数据。因为User 表的实体中会有可用的集合类型。

您只需将值与Orders 字段一起分配给用户表的实体,并且只插入一次。

代码如下:

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

然后保存此数据。它将根据 UserId 将 Orders 数据本身保存在 Order 表中。

db.Add(userAndOrder);
db.SaveChanges();

【讨论】:

  • Imran(有趣的是我有一个朋友叫 Imran)。实际使用的表确实允许多对多。我转换为 User & Orders 来演示布局,同时隐藏原始表名。在我们的例子中,“Table2”可以属于许多“Table1”条目。此外,实际完成工作的方法会传递一个用户模型。根据您的示例,我可以简单地执行 db.Add(thePassedInModel)) ,然后执行 db.SaveChanges() ,它将保存两个模型,对吗?前任。 ``` public boolean insertRecord (User myUser) { if(myUser != null) { db.add(myUser); db.SaveChanges(); } } ```
  • 有一个和我同名的朋友真是太巧合了。好吧,我无法得到你的例子。无论如何,正如您对表格的描述,它们也可以按照我解释的方式添加数据。但是你必须正确填充模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 2012-04-28
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
相关资源
最近更新 更多