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

Entity framework 在实体框架中使用子记录的标识更新父记录,entity-framework,transactionscope,Entity Framework,Transactionscope,我有两张桌子,父母和孩子。两者都有一个自动增量标识字段作为主键。子项有一个包含父项ID的字段,并且有一个强制该关系的FK 父项有一个包含最新子项ID的字段 CREATE TABLE parent ( parentid int IDENTITY(1,1) NOT NULL, latestchildid int, parentdata nvarchar(256), CONSTRAINT PK_parent PRIMARY KEY CLUSTERED (

我有两张桌子,父母和孩子。两者都有一个自动增量标识字段作为主键。子项有一个包含父项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; }
}
问题是它需要两个事务

但是,如果我将其全部封装在TransactionScope中,只要EF决定对各个部分使用不同的连接(这是一个几乎不受我们控制的决定),它就会将事务升级到分布式,这需要在用户机器和数据库主机上配置和运行MSDTC。这完全是一种恶化

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


或者我可以强制EF为此事务使用单个连接,这样它就不会将其升级为分布式吗?

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

然后添加到父类
公共虚拟子类latestchild{get;set;}

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


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

检测到引用完整性约束的循环关系。EF版本是什么?你还可以发布modelEF 6.0吗?你指的是哪种型号?我发布了EF DTO,但我看不出业务层域模型或UI viewmodels的相关性。您需要将最新的子id存储在父级中的强度如何?不幸的是,EF不允许两个实体类型在两个方向上都有关联,我应该意识到这一点;您的两个选项是按原样执行两个保存操作,或者在需要时使用linq/expression派生最新的操作。我们正在询问是否需要。如果子记录的索引正确,访问当前子记录的速度应该相当快。
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();