0..1到N引用关系 - >错误信息我不明白

时间:2016-04-26 15:56:04

标签: ef-code-first entity-framework-6

问题是我收到的错误信息是:

  

INSERT语句与FOREIGN KEY约束冲突" FK_dbo.Users_dbo.People_Id"。冲突发生在数据库" TrialDb",table" dbo.People",column' Id'

我试图强调以下内容:

  • User可能已分配Person,而Person可能会分配多个User
  • 每个实体,即Person或任何其他实体,都将拥有创作者和不断变化的用户集。

这种关系是单向的,这意味着User不需要Person的导航属性。

我正在尝试向我的数据库添加User,这会导致上述错误。

这是UserPerson类定义(abreviated)

public class User
{
    public int Id {get; set;}

    public int? PersonId {get; set; }
    public virtual Person Person {get; set;}

    // two self-refencing properties
    public int CreatorId {get; set; }
    public virtual Person Creator{get; set;}

    public int ChangingUserId {get; set; }
    public virtual Person ChangingUser {get; set;}

    public byte[] RowVersion {get; set;}
}

public class Person 
{
    public int Id {get; set;}

    public virtual ICollection<User> Users {get; set;}

    public byte[] RowVersion {get; set;}
}

我的两个实体的配置类如下:

 public class UserMap : EntityTypeConfiguration<User>
{
    public UserMap ()
    {
        HasRequired (p => p.Creator).WithRequiredPrincipal ().WillCascadeOnDelete (false);
        HasRequired (p => p.ChangingUser).WithRequiredPrincipal ().WillCascadeOnDelete (false);

        // 0..1 : N relation
        HasOptional (p => p.Person).WithMany (p => p.Users).HasForeignKey (p => p.PersonId);

        Property (p => p.RowVersion).IsRowVersion ();
    }
}

public class PersonMap : EntityTypeConfiguration<Person>
{
    public PersonMap ()
    {
        HasRequired (p => p.Creator).WithRequiredPrincipal ().WillCascadeOnDelete (false);
        HasRequired (p => p.ChangingUser).WithRequiredPrincipal ().WillCascadeOnDelete (false);

        // 0..1 : N relations - tried this as well - same result
        //HasOptional (p => p.Company).WithMany (p => p.Employees).HasForeignKey (p => p.CompanyId);
        //HasOptional (p => p.Facility).WithMany (p => p.People).HasForeignKey (p => p.FacilityId);

        Property (p => p.RowVersion).IsRowVersion ();
    }
}

有人可以帮我这个吗?这将是最好的答案!

1 个答案:

答案 0 :(得分:0)

您的模型中没有的People_Id表示EF已插入,因为您的流畅代码错误。您的用户表指向Person 3次,但您的流畅代码仅告知EF如何映射一个FK(PersonId)。您需要更改另外2个以使用HasForeignKey或MapKey指示ForeignKey分配(抱歉没有现成的测试项目)。

尝试使用UserMap这样的内容:

HasRequired(p => p.Creator).WithMany().HasForeignKey(p => p.CreatorId).WillCascadeOnDelete (false);
HasRequired(p => p.ChangingUser).WithMany().HasForeignKey(p => p.ChangingUserId).WillCascadeOnDelete (false);

我不确定您在PersonMap中尝试做什么,因为您的流畅代码引用了不在模型中的2个导航属性。假设你想要2个自引用,你需要类似的代码。