gpt4 book ai didi

c# - Entity Framework - 同时插入带有 FK 的父子模型

转载 作者:太空宇宙 更新时间:2023-11-03 20:53:51 31 4
gpt4 key购买 nike

我有一个使用 Entity Framework 的 ASP.NET MVC 应用程序。我开发了 2 个模型,对 SQL Server 2008 R2 数据库使用数据库优先(代码)方法。一个模型本质上是父模型,另一个是子模型,其中包含指向父模型的数据库生成列的外键。

伪代码:

CREATE TABLE PARENT
(
ROWID BIGINT IDENTITY(1,1) NOT NULL,
VALUE NVARCHAR(255) NOT NULL,

PRIMARY KEY(ROWID)
);

CREATE TABLE CHILD
(
ROWID BIGINT IDENTITY(1,1) NOT NULL,
PARENT_ROWID BIGINT NOT NULL,
VALUE NVARCHAR(255) NOT NULL,

PRIMARY KEY(ROWID),
FOREIGN KEY(PARENT_ROWID) REFERENCES PARENT(ROWID)
);

所有这些工作正常,我能够将我的数据绑定(bind)到我的模型并编辑字段等等。我的问题是,如果我正在尝试为这些模型创建记录,当 CHILD 的外键位于 PARENT 中时,如果我同时创建它们尚不可用,我该如何做?

所以,我目前的基本步骤是:

  1. 获取要插入数据库的 PARENT 模型列表
  2. 插入 PARENT 模型
  3. 调用SaveChanges()

    • 对于每位家长:

      1. 为 parent 获得 FK
      2. 获取要插入数据库的 CHILD 模型列表
      3. 对于每个 CHILD 模型,插入带有该 FK 的 CHILD
      4. 调用SaveChanges()
  4. 其他模型的数据库的额外操作和更新

  5. 调用SaveChanges()

我确定我可以优化它,但这不是我关心的。在我看来,应该有一些方法可以在不手动查找 FK 或手动设置 FK 的情况下执行此操作。如果必须,我可以这样做,但我只想使用一个 SaveChanges() 调用来在单个事务中推送这些命令。我正在寻找类似以下内容的内容:

  1. 获取要插入数据库的父模型列表

    • 对于每位家长
      1. 插入 PARENT 并返回新的 FK(不保存)
      2. 获取要插入数据库的 CHILD 模型列表
      3. 对于每个 CHILD 模型,插入带有该 FK 的 CHILD
  2. 其他模型的数据库的额外操作和更新

  3. 调用SaveChanges()

为了提供一些上下文,我的实际表有许多列不能保证是唯一的(这就是 PK 在 ROWID 上的原因),并且这些行中的每一行都与子表没有对多关系,其中子表也可能有非唯一行。不是很理想,但这是我们目前运营所需要的。我在此处包含了伪代码,因为实际代码是专有的,但如果需要,我可能会创建一个真实的模型。

有什么建议吗?

谢谢

编辑:所以我更改了代码以按照建议使用导航属性。这几乎有效。这是我的代码:

List<PARENT> parents = getParents();
List<CHILD> children = getChildren();
foreach (PARENT parent in parents)
{
db.PARENT.add(parent);
foreach (CHILD child in children)
{
child.PARENT = parent;
db.CHILD.add(child);
}
}

db.SaveChanges();

乍一看,这正是我要找的。但是,当我运行它时,只为第一个父记录插入子记录。因此,例如,如果我有 3 个 PARENT 记录和 3 个 CHILD 记录,我的 CHILD 表中应该有 9 个新记录。但是,在这段代码之后,第一个 PARENT 我只有 3 条记录。

我假设这与我重复使用相同的子项列表并且 Entity Framework 以某种方式将它们视为重复项这一事实有关。我将它移入 PARENT for 循环,如下所示,它按预期工作:

List<PARENT> parents = getParents();
foreach (PARENT parent in parents)
{
db.PARENT.add(parent);
List<CHILD> children = getChildren();
foreach (CHILD child in children)
{
child.PARENT = parent;
db.CHILD.add(child);
}
}

db.SaveChanges();

但是,我不想这样做,因为 getChildren() 函数相当麻烦。有什么想法吗?

最佳答案

使用导航属性;将“Child.Parent”导航属性设置为尚未保存的“Parent”实体,EF 将通过一次调用“SaveChanges”以正确的顺序插入它们

关于c# - Entity Framework - 同时插入带有 FK 的父子模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52615106/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com