为什么我得到:无法使用以下代码确定...错误的原理结束

时间:2012-01-20 23:16:23

标签: entity-framework-4.1 code-first

目前正在调整我正在进行的项目上的模型,我已经碰壁了,似乎无法发现为什么我会收到错误。

我有两个班级

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.

我似乎无法发现我错过的东西。

非常感谢任何帮助。

谢谢,

1 个答案:

答案 0 :(得分:2)

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且没有其他值。