问题是我收到的错误信息是:
INSERT语句与FOREIGN KEY约束冲突" FK_dbo.Users_dbo.People_Id"。冲突发生在数据库" TrialDb",table" dbo.People",column' Id'
我试图强调以下内容:
User
可能已分配Person
,而Person
可能会分配多个User
Person
或任何其他实体,都将拥有创作者和不断变化的用户集。这种关系是单向的,这意味着User
不需要Person
的导航属性。
我正在尝试向我的数据库添加User
,这会导致上述错误。
这是User
和Person
类定义(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 ();
}
}
有人可以帮我这个吗?这将是最好的答案!
答案 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个自引用,你需要类似的代码。