【问题标题】:Updating parent record with identity of child record, in Entity Framework在实体框架中使用子记录的身份更新父记录
【发布时间】:2013-11-15 17:42:26
【问题描述】:

我有两张桌子,父母和孩子。两者都有一个自动增量标识字段作为主键。 Child 有一个包含父 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 的值,并将其写入 parent,而无需调用 SaveChanges() 两次吗?

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

【问题讨论】:

    标签: entity-framework transactionscope


    【解决方案1】:

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

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

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

    删除您分配的最后两行并再次保存

    【讨论】:

    • 检测到具有参照完整性约束的循环关系。
    • 什么是 EF 版本?你也可以发布模型
    • EF 6.0 - 你指的是哪个型号?我发布了 EF DTO,但看不到业务层域模型或 UI 视图模型的相关性。
    • 在父节点中存储最新的子 ID 需要多强?不幸的是,EF 不允许在两个方向都有关联的两种实体类型,我应该意识到这一点;您的 2 个选项是拥有 2 个保存操作,或者在需要时使用 linq/expression 派生最新的操作
    • 我们正在质疑是否需要。如果子记录被正确索引,访问当前子记录应该相当快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2018-12-16
    相关资源
    最近更新 更多