问题是我收到一条错误消息,内容如下:
INSERT 语句与 FOREIGN KEY 约束"FK_dbo冲突。Users_dbo。People_Id"。冲突发生在数据库"TrialDb"中,表"dbo。人物","Id"一栏
我试图实现以下内容:
-
User
可能分配了Person
,Person
可能分配了许多User
- 每个实体,即
Person
或任何其他,将有一个创建者和一个不断变化的用户集。
该关系应该是单向的,这意味着User
不需要用于Person
的导航属性。
我正在做的是尝试向我的数据库添加一个User
,这会导致上述错误。
这是User
和Person
类定义(缩写)
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 ();
}
}
有人可以帮我解决这个问题吗?这将是最感激的!
没有的People_Id指示 EF 已插入它,因为流畅的代码是错误的。用户表指向人员 3 次,但流畅代码仅告知 EF 如何映射一个 FK (PersonId)。您需要更改其他 2 个以使用 HasForeignKey 或 MapKey 指示外键分配(抱歉,没有现成的测试项目)。
为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 个自引用,你需要类似的代码。