ASP.NET Core MVC & EF Core:Fluent API关系配置错误求助
修正Relationship与RelationshipType的关系配置问题
当前配置将Relationship和RelationshipType设为一对一关系,外键RelationshipId放在RelationshipType表中,这不符合“一个关系类型对应多个联系人关系”的业务逻辑。正确的设计应该是一对多关系:一个RelationshipType可以对应多个Relationship,外键RelationshipTypeId应放在Relationship表中,这样创建联系人关系时只需在Relationship中指定类型ID即可,无需操作两张表。
1. 修改模型类
Contact模型(无需修改)
public class Contact { public int Id { get; set; } public string? FirstName { get; set; } public string? LastName { get; set; } public virtual ICollection<Relationship> Relationships { get; set; } = new HashSet<Relationship>(); }
Relationship模型
添加RelationshipTypeId外键字段,关联关系类型:
public class Relationship { public int Id { get; set; } public int? ParentId { get; set; } public virtual Contact? Parent { get; set; } public int? ChildId { get; set; } public virtual Contact? Child { get; set; } // 添加关系类型外键 public int? RelationshipTypeId { get; set; } public virtual RelationshipType? RelationshipType { get; set; } }
RelationshipType模型
移除原一对一关联的字段和导航属性,添加一对多集合导航:
public class RelationshipType { public int Id { get; set; } public string? Type { get; set; } // 移除原一对一关联的冗余字段 // public int? RelationshipId { get; set; } // public virtual Relationship? Relationship { get; set; } // 添加一对多集合导航 public virtual ICollection<Relationship> Relationships { get; set; } = new HashSet<Relationship>(); }
2. 修改Fluent API配置
更新Relationship的关联配置,设置正确的一对多关系:
// Relationship configuration modelBuilder.Entity<Relationship>(b => { b.HasOne(r => r.Parent) .WithMany(c => c.Relationships) .HasForeignKey(r => r.ParentId) .OnDelete(DeleteBehavior.Restrict); // 可选,避免级联删除冲突 b.HasOne(r => r.Child) .WithMany() .HasForeignKey(r => r.ChildId) .OnDelete(DeleteBehavior.Restrict); // 可选 // 配置与RelationshipType的一对多关联 b.HasOne(r => r.RelationshipType) .WithMany(rt => rt.Relationships) .HasForeignKey(r => r.RelationshipTypeId); });
说明
- 修改后创建联系人关系时,只需在
Relationship实体中设置RelationshipTypeId(比如对应“员工”类型的ID),即可直接关联到目标关系类型,无需操作RelationshipType表。 - 级联删除规则可根据业务需求调整
OnDelete参数,例如DeleteBehavior.Cascade或DeleteBehavior.SetNull。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

