自引用表创建它自己的Parent_ID列,它会破坏我的映射

时间:2013-09-29 12:34:52

标签: c# entity-framework

我有以下课程:

public class Page : BaseModel
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int PageID { get; set; }
    public int? ParentID { get; set; }
    public string Name { get; set; }

    public virtual Page Parent { get; set; }
    public virtual ICollection<Page> Children { get; set; }

    public IDictionary<int, string> PossibleParents
    {
        get
        {
            Dictionary<int, string> items = new Dictionary<int, string>();
            items.Add(-1, "Please Select");

            using (var context = new WebsiteContext())
            {
                var pages = context.Pages;
                foreach (var p in pages)
                    items.Add(p.PageID, p.Name);                    
            }

            return items;
        }
    }

    public Page()
    {
        this.Order = 0;
        this.Live = false; 
    }
}

public class CommodityPageMap : EntityTypeConfiguration<Page>
{
    public CommodityPageMap()
    {
        HasOptional(x => x.Parent)
            .WithMany(x => x.Children)
            .HasForeignKey(x => x.ParentID)
            .WillCascadeOnDelete(false);
    }
}

问题

我认为它会映射ParentID以将页面链接到父页面。然而,似乎在更新数据库时EF已创建Parent_PageID。现在,当我设置ParentID时,它没有正确创建关联,Parents不包含任何元素,因为Parent_PageID为空。

我试过

如果我删除ParentID,则无法编译,因为它需要设置外键。我无法将数据注释[Column("Parent_PageID")]添加到ParentID,因为这会在访问PossibleParents时在运行时产生错误,将Parent_PageID添加到我的模型中似乎很愚蠢并忽略ParentID

我认为我错过了一些东西但是会感激一些帮助。

修改

我刚刚尝试添加以下内容:

public int? ParentID { get { return this.Parent_PageID; } set { this.Parent_PageID = value; } }
public int? Parent_PageID { get { return this.ParentID; } set { this.Parent_PageID = value; } }

但是在尝试访问Sequence contains no elements时会引发PossibleParents

1 个答案:

答案 0 :(得分:0)

我设法解决了我的问题,虽然我不知道为什么使用Fluent API会导致问题。

我使用ParentID更改了代替Parent_PageID的代码。然后,我将[ForeignKey("Parent")]数据注释添加到Parent_PageID。我的代码最终是这样的:

public class Page : BaseModel
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int PageID { get; set; }
    [ForeignKey("Parent")]
    public int? Parent_PageID { get; set; }
    public int Order { get; set; }
    public bool Live { get; set; }
    [Required]
    [MaxLength(255)]
    public string Name { get; set; }
    public string SEOTitle { get; set; }
    public string SEODescription { get; set; }
    public string SEOKeywords { get; set; }
    [AllowHtml]
    public string Content { get; set; }

    public virtual Page Parent { get; set; }
    public virtual ICollection<Page> Children { get; set; }

    public IDictionary<int, string> PossibleParents
    {
        get
        {
            Dictionary<int, string> items = new Dictionary<int, string>();
            items.Add(-1, "Please Select");

            using (var context = new WebsiteContext())
            {
                var pages = context.Pages;
                foreach (var p in pages)
                    items.Add(p.PageID, p.Name);                    
            }

            return items;
        }
    }

    public Page()
    {
        this.Order = 0;
        this.Live = false; 
    }
}