【发布时间】: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