![](/img/trans.png)
[英]EF Core using navigation property when querying parent and child separatedly
[英]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 INSERT
上CREATE TRIGGER
以根据 GuidId 编辑插入的数据,但它失败了,因为 ef 核心的事务隔离级别是 ReadCommitted。
因此触发器在插入 Child 时无法读取Parent.Id
,因为 ef 核心事务尚未提交。
我希望有人能帮助我找到解决这个问题的方法,或者建议我改变实体或关系的设计?
数据库永远不应将父实体数据存储在子实体中。 主要的数据库设计规则之一是从不复制数据。 可以通过连接父表和子表来读取或更新相关数据。 重复数据是在“重复”属性中具有不同值的完全不必要的机会。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.