首先使用代码将实体导航属性映射到同一表

本文关键字:映射 属性 导航 实体 代码 | 更新日期: 2023-09-27 18:34:57

我有一个实体,其属性名为 ParentId 链接到名为 Parent 的导航属性。这种关系似乎工作正常,但我的问题是现在我想拥有另一个导航属性,该属性将是父项与实体 ID 相同的"子"项列表。

我已经在我的FK属性中尝试了"ID","父级",但是我收到"类型'jrSite.Core.SiteModel'上的属性'子项'上的外键属性无效"错误。

如何告知 EF 我希望该导航属性在 SiteModel 表中搜索具有匹配父 ID 的项目?

我的班级在下面

public class SiteModel
{
    public SiteModel() { }
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    public DateTime Created { get; set; }
    [ForeignKey("Creator")]
    public int CreatorID;
    public SiteAccount Creator { get; set; }
    [ForeignKey("Owner")]
    public int OwnerID;
    public SiteAccount Owner { get; set; }
    [ForeignKey("Parent")]
    public int? ParentID;
    public SiteModel Parent { get; set; }
    [ForeignKey("Parent")]
    public List<SiteModel> Children { get; set; }
    public SiteModel(SiteAccount creator, SiteAccount owner)
    {
        Creator = creator;
        Owner = owner;
        Created = DateTime.Now;
    }
}

首先使用代码将实体导航属性映射到同一表

ParentID/Parent nav 属性已经处理了这种关系 - 去掉 Children 属性声明上的 ForeignKey 属性。 我刚刚测试了以下内容,它可以工作:

public class HierarchicalEntity
{
    public int Id { get; set; }
    public string Description { get; set; }
    public int? ParentId { get; set; }
    public virtual HierarchicalEntity Parent { get; set; }
    public virtual ICollection<HierarchicalEntity> Children { get; set; }
}

        using (var db = new TestEntities())
        {
            var parent = new HierarchicalEntity();
            db.HierarchicalEntity.Add(parent);
            var children = new List<HierarchicalEntity>()
            {
                new HierarchicalEntity() { Parent = parent },
                new HierarchicalEntity() { Parent = parent }
            };
            children.ForEach(c => db.HierarchicalEntity.Add(c));
            db.SaveChanges();
        }

在 DBContext 类中重写 OnModelCreate 并添加以下代码:

modelBuilder.Entity<SiteModel>()
  .HasRequired<SiteAccount>(s => s.Creator);

modelBuilder.Entity<SiteModel>()
  .HasRequired<SiteAccount>(s => s.Owner);