繁体   English   中英

自动将子属性分配给父属性 EF Core

[英]Auto assign child property to parent property EF Core

我有以下课程。

    public class Parent 
    {
        public int CompanyId { get; set; }

        public int BranchId { get; set; }

        public int Id { get; set; }

        public string GuidId { get; set; }

        public virtual ICollection<Child> Children { get; set; }

        // The PRIMARY KEY is ( CompanyId, BranchId, Id )
        // There is also a UNIQUE KEY ( GuidId )
        // Id column is SQL Server identity(1,1)
    }

    public class Child
    {
        public int CompanyId { get; set; }

        public int BranchId { get; set; }

        public int Id { get; set; }

        public string GuidId { get; set; }

        public int ParentId { get; set; }

        public string ParentGuidId { get; set; }

        public virtual Parent Parent { get; set; }

        // The PRIMARY KEY is ( CompanyId, BranchId, ParentId, Id )
        // There is also a UNIQUE KEY ( GuidId )
        // Id column is SQL Server identity(1,1)
    }

我使用唯一键配置父子关系如下

    // Parent
    builder.HasMany(p => p.Children)
        .WithOne(c => c.Parent)
        .HasPrincipalKey(p => p.GuidId)
        .HasForeignKey(c => c.ParentGuidId);

    // Child
    builder.HasOne(c => c.Parent)
        .WithMany(p => p.Children)
        .HasPrincipalKey(a => a.GuidId)
        .HasForeignKey(a => a.ParentGuidId);

因为这种关系使用UNIQUE KEY列(而不是PRIMARY KEY ),EF Core 只会在加载相关实体或设置virtual Parent Parent时自动填充ParentGuidId属性,但我希望 EF Core填充其他属性。

例如:

Parent p = dbContext.Parents.Single( p => p.ParentGuidId == "(some GUID value)" );

Console.WriteLine( p.GuidId ); // "(some GUID value)" // OK!
Console.WriteLine( p.CompanyId ); // "123"
Console.WriteLine( p.Id ); // "456"

Child newChild = new Child()
{
    Parent = p
};

Console.WriteLine( newChild.ParentGuidId ); // "(some GUID value)" // OK!
Console.WriteLine( newChild.CompanyId ); // "123" // OK!.
Console.WriteLine( newChild.ParentId ); // "0" // This should be "456" instead.

dbContext.Childs.Add( newChild );
dbContext.SaveChanges(); // <-- Saved with `newChild.ParentId` = 0 and I want EF Core to map 'Parent.Id "456"' to 'newChild.ParentId'

子实体知道 CompanyId 和 BranchId,因为我手动将每个子实体设置为其父基础数据(CompanyId、BranchId 等...)

不是 Child.Parentaid 丢失,因为它由 sql 服务器标识填充。

我尝试在 Child INSERTCREATE TRIGGER以根据 GuidId 编辑插入的数据,但它失败了,因为 ef 核心的事务隔离级别是 ReadCommitted。

因此触发器在插入 Child 时无法读取Parent.Id ,因为 ef 核心事务尚未提交。

我希望有人能帮助我找到解决这个问题的方法,或者建议我改变实体或关系的设计?

数据库永远不应将父实体数据存储在子实体中。 主要的数据库设计规则之一是从不复制数据。 可以通过连接父表和子表来读取或更新相关数据。 重复数据是在“重复”属性中具有不同值的完全不必要的机会。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM