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



问题是我收到一条错误消息,内容如下:

INSERT 语句与 FOREIGN KEY 约束"FK_dbo冲突。Users_dbo。People_Id"。冲突发生在数据库"TrialDb"中,表"dbo。人物","Id"一栏

我试图实现以下内容:

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

有人可以帮我解决这个问题吗?这将是最感激的!

模型中

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

相关内容

最新更新