2016-04-26 43 views
0

的问题是,我收到错误消息阅读:0..1到N引用关系 - >错误消息我不明白

INSERT语句冲突与外键约束“FK_dbo .Users_dbo.People_Id”。冲突发生于数据库 “TrialDb”,表 “dbo.People”,列 'ID'

我尝试implment如下:

  • User可能有分配PersonPerson可能有很多User转让
  • 每个实体,即Person或任何其他,将有一个创建者和一个不断变化的用户集。

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

我在做什么是试图将User添加到我的数据库,导致上述错误。

这里是UserPerson类定义(简写为)两个实体

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(); 
    } 
} 

任何人可以帮助我吗?这将是最重要的apprciated!

回答

0

People_Id不在您的模型中,表示EF已插入它,因为您的流利代码是错误的。你的用户表指向Person 3次,但你的流利的代码只告诉EF如何映射一个FK(PersonId)。您需要更改其他2以使用HasForeignKey或MapKey指示ForeignKey分配(对不起,没有可用的测试项目)。

尝试像这样为用户映射:

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个自引用,你需要类似的代码。

+0

谢谢你解答我的问题的答案! – mph