【问题标题】:Cannot Insert duplicate key on related table无法在相关表上插入重复键
【发布时间】:2017-08-29 20:57:40
【问题描述】:

我的模型有所有者和复合体。一个所有者可以拥有多个联合体,一个联合体理论上可以拥有多个所有者(共同所有权)。我希望能够独立地创建新的复合体和所有者,所以两者都不应该需要另一个。然而,当我尝试添加一个新的复合体时,我得到了这个错误:

违反主键约束“PK_dbo.Owners”。无法在对象“dbo.Owners”中插入重复键。重复键值为 (fcd72b09-b1ef-4894-83de-cb4897c0c401)。 声明已终止。

作为记录,目前有一个现有所有者(具有错误中提到的 ID)。所有者已与另一个复合体关联。我应该可以为这个所有者添加一个新的复合体,但显然它不允许我这样做。

我需要对我的模型进行哪些更改以适应这种情况?相关代码如下:

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //modelBuilder.Entity<Complex>().ToTable("Complex");
        //modelBuilder.Entity<Unit>().ToTable("Unit");
        //modelBuilder.Entity<Address>().ToTable("Addresses");
        //modelBuilder.Entity<Tenant>().ToTable("Tenant");

        modelBuilder.Entity<ContactInfo>().ToTable("Contacts");

        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

        modelBuilder.Entity<Complex>()
            .HasOptional(x => x.Owner)
            .WithMany(x => x.Complexes);
        modelBuilder.Entity<Unit>()
            .HasOptional(x => x.Complex)
            .WithMany(x => x.Units);
        modelBuilder.Entity<Owner>()
            .HasMany(x => x.Complexes);

        base.OnModelCreating(modelBuilder);
    }
}

所有者和复杂模型:

public class Owner
{
    [Key]
    public Guid Id { get; set; }
    public string Name { get; set; }
    public Guid? ContactInfoId { get; set; }
    [ForeignKey("ContactInfoId")]
    public ContactInfo ContactInfo { get; set; }

    public ICollection<StaffMember> Employees { get; set; }
    public ICollection<Complex> Complexes { get; set; }

    public Owner()
    {
        this.Id = System.Guid.NewGuid();
        this.Employees = new HashSet<StaffMember>();
        this.Complexes = new HashSet<Complex>();
    }

    public void AddEmployee(StaffMember employee)
    {
        Employees.Add(employee);
    }

    public void AddComplex(Complex complex)
    {
        Complexes.Add(complex);
    }
}

public class Complex
{
    [Key]
    public Guid Id { get; set; }
    public string Name { get; set; }

    public Guid? OwnerId { get; set; }
    [ForeignKey("OwnerId")]
    public Owner Owner { get; set; }

    public Guid? AddressId { get; set; }
    [ForeignKey("AddressId")]
    public virtual Address Address { get; set; }

    public virtual ICollection<Unit> Units { get; set; }
    public virtual ICollection<StaffMember> StaffMembers { get; set; }

    public Complex()
    {
        this.Id = System.Guid.NewGuid();
        this.Units = new HashSet<Unit>();
        this.StaffMembers = new HashSet<StaffMember>();
    }

    public void AddUnit(Unit unit)
    {
        Units.Add(unit);
    }

    public void AddStaff(StaffMember staffMember)
    {
        StaffMembers.Add(staffMember);
    }
}

【问题讨论】:

  • 您的实体设置不正确。在您的 Complex 对象中,您声明它只有 1 个所有者,因此您将其设置为一对多而不是多对多。如果您将其设置为集合而不是对象,EF 将为您处理多对多表。
  • 谢谢!我觉得有道理。流利的 API 东西呢?这完全相关还是我误解了它的用途?
  • 进行了这些更改,但仍然看到重复键错误。
  • 没关系 - 我必须将“重复”实体附加到数据库上下文,这样它就不会尝试重新创建它。这解决了问题。
  • 我会让我的评论成为答案。

标签: entity-framework foreign-keys many-to-many


【解决方案1】:

您的实体设置不正确。在您的 Complex 对象中,您声明它只有 1 个所有者,因此您将其设置为一对多而不是多对多。如果将其设置为集合而不是对象,EF 将为您处理多对多表

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 2012-11-07
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多