与实体框架代码优先的半递归关联



我希望你能帮我解决我遇到的一个小问题。

我有一个实体框架代码优先设置,其中我有以下设置:

public class UserDetails{
public int Id {get;set;}
//... some other properties .. //
//This represents the approval group the user is a member of.
public virtual ApprovalGroup {get;set;}
//This represents the approval groups that the user is resposible for approving
public virual ICollection<ApprovalGroup> ApprovalGroups {get;set;}
}
public class ApprovalGroup
{
public int Id {get;set;}
public string Name {get;set;}
public virtual UserDetails Approvee {get;set;}
public virtual ICollection<UserDetails> Members {get;set;}
}

在我的数据库上下文中,我有以下内容:

modelBuilder.Entity<ApprovalGroup>().ToTable("ApprovalGroup")
.HasKey(t=>t.Id)
.HasRequired(t=>t.Approver);
modelBuilder.Entity<ApprovalGroup>().HasMany(t=>t.Members)
.WithOptional().WillCascadeOnDelete(false);

因此,审批组必须具有审批者设置,但它可能没有成员(尤其是在首次配置时)。

此代码正在运行,但是当我检查它创建的数据库时,批准组表中有一个名为"UserDetails_Id"的额外列。它设置为外键,但始终为 null。

它创建的表的架构具有以下列:

Id, Name, UserDetails_Id, Approver_Id

我不知道为什么它会创建不必要的表"UserDetails_Id",我希望它不会,因为没有理由。我怀疑我的配置/映射行为有问题,但我无法弄清楚它是什么。

到目前为止,谷歌未能阐明我做错了什么,所以如果这里有人可以提供帮助,将不胜感激。

尼克

您遇到的问题是由于不正确/不完整的关系映射以及 EF 默认约定。

我建议您始终单独配置关系,每个关系仅配置一次,并使用与导航和显式 FK 属性的存在/不存在完全匹配的重载。

在此特殊情况下,您有两个one-to-many双向(即两端都有导航属性)关系,没有显式 FK 属性。所以正确的配置应该是这样的:

// Entities
modelBuilder.Entity<ApprovalGroup>()
.ToTable("ApprovalGroup")
.HasKey(t => t.Id);
modelBuilder.Entity<UserDetails>()
.ToTable("UserDetails")
.HasKey(t => t.Id);
// Relationships
modelBuilder.Entity<ApprovalGroup>()
.HasRequired(t => t.Approver)
.WithMany(t => t.ApprovalGroups);
modelBuilder.Entity<ApprovalGroup>()
.HasMany(t => t.Members)
.WithOptional(t => t.ApprovalGroup) // or whatever the name of the navigation property is (it's missing in the posted code)
.WillCascadeOnDelete(false);

最新更新