在实体框架中使用子记录的标识更新父记录



我有两个表,父表和子表。两者都有一个自动增量标识字段作为主键。子项具有一个包含父级 ID 的字段,并具有强制执行该关系的 FK。

家长有一个包含最新孩子 ID 的字段。

CREATE TABLE parent
(
    parentid int IDENTITY(1,1) NOT NULL,
    latestchildid int,
    parentdata nvarchar(256),
    CONSTRAINT PK_parent PRIMARY KEY CLUSTERED 
    (
        parentid
    )
)
CREATE TABLE child
(
    parentid int,
    childid int IDENTITY(1,1) NOT NULL,
    childdata nvarchar(256),
    CONSTRAINT PK_child PRIMARY KEY CLUSTERED 
    (
        parentid,
        childid
    )
)
ALTER TABLE child
ADD  CONSTRAINT FK_child_parent
FOREIGN KEY (parentid)
REFERENCES parent (parentid)
public partial class parent
{
    public int parentid { get; set; }
    public int latestchildid { get; set; }
    public string parentdata { get; set; }
    public virtual ICollection<child> child {get; set; }
}
public partial class child
{
    public int parentid { get; set; }
    public int childid { get; set; }
    public string childdata { get; set; }
    public virtual parent { get; set; }
}

如何在单个事务中插入新的父记录和新的子记录,并更新父记录中的最新子字段?

什么有效:

var parent = new parent
    {
        parentdata = "Some info about a parent"
    };
var child = new child
    {
        childdata = "Some info about a child"
    };
parent.child.Add(child);
dbContext.parents.Add(parent);
dbContext.SaveChanges();
parent.latestchildid = child.childid;
dbContext.SaveChanges();

这样做的问题是它需要两个事务。

但是,如果我将其全部包装在 TransactionScope 中,则每当 EF 决定对各个部分使用不同的连接(这是一个几乎我们无法控制的决定)时,它就会将事务提升为分布式,这要求在用户计算机和数据库主机上配置和运行 MSDTC。 这是一种不折不扣的加重。

那么,我可以获取 childid 的值,并将其写入父级,而不必调用 SaveChanges() 两次吗?

或者,我可以以某种方式强制 EF 为此事务使用单个连接,以便它不会将其提升为分布式连接?

使用 latestchildid 作为主键,为父项和子项之间的外键关系创建另一个约束

然后添加到您的父类public virtual child latestchild {get; set; }

然后在第一次保存更改之前添加新分配parent.latestchild = child;

删除您分配的最后 2 行并重新保存

相关内容

最新更新