目前正在对我正在研究的项目进行模型调整,但遇到了麻烦,似乎无法发现为什么会出错。
我有两个班
public class CorePage : BaseClass
{
public CorePage()
{
this.PageContent = new HashSet<PageContent>();
this.PageAliases = new HashSet<PageAlias>();
this.isEditable = true;
}
public string DisplayLabel { get; set; }
public bool isEditable { get; set; }
public int? ParentPageId { get; set; }
public virtual CorePage ParentPage { get; set; }
public int TemplateId { get; set; }
public virtual Template Template { get; set; }
public int DefaultPageAliasId { get; set; }
public virtual PageAlias DefaultPageAlias { get; set; }
public virtual ICollection<PageAlias> PageAliases { get; set; }
public virtual ICollection<PageContent> PageContent { get; set; }
}
和
public class PageAlias : BaseClass
{
public PageAlias()
{
}
public string Alias { get; set; }
public int PageId { get; set; }
public virtual CorePage Page { get; set; }
}
两个类之间的关系配置如下。
public class CorePageConfiguration : EntityTypeConfiguration<CorePage>
{
public CorePageConfiguration()
{
HasOptional(cp => cp.ParentPage).WithMany().HasForeignKey(cp => cp.ParentPageId).WillCascadeOnDelete(false);
HasRequired(p => p.DefaultPageAlias).WithRequiredDependent().WillCascadeOnDelete(false);
}
}
和
public class PageAliasConfiguration : EntityTypeConfiguration<PageAlias>
{
public PageAliasConfiguration()
{
Property(pa => pa.Alias).IsRequired().HasMaxLength(500);
HasRequired(pa => pa.Page).WithMany(p => p.PageAliases).HasForeignKey(pa => pa.PageId).WillCascadeOnDelete(false);
}
}
问题是我不断收到此错误:
Unable to determine the principal end of the 'Core.DataContext.PageAlias_Page' relationship. Multiple added entities may have the same primary key.
而且我似乎无法发现我错过的一切。
任何帮助将非常感激。
谢谢,
最佳答案
将DefaultPageAlias
映射为一对多(而不是一对一)关系:
HasRequired(p => p.DefaultPageAlias)
.WithMany()
.HasForeignKey(cp => cp.DefaultPageAliasId)
.WillCascadeOnDelete(false);
您不能同时使用不是主键属性的外键属性创建一对一关系。 EF仅支持Shared Primary Key Associations定义一对一关系。
我认为共享主键不适合您的模型,因为我认为
DefaultPageAlias
可以是PageAliases
集合中的别名之一。换句话说,DefaultPageAliasId
可以是2,但也可以是3或另一个值。对于共享主键,这是不可能的,因为DefaultPageAlias
必须始终与CorePage
具有相同的主键。如果CorePage
具有Id = 2,则DefaultPageAlias
只能具有Id = 2,不能具有其他值。