我有以下课程:
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
。
答案 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;
}
}