错误:介绍FOREIGN KEY约束' FK_dbo.TenantUnits_dbo.Units_Unit_Id'在桌面' TenantUnits'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。
我知道这个错误与我模型中关系的本质有关,但是我太困惑了,无法解决它。我在思考我的模型中涉及的级联和许多关系时遇到了麻烦。
模型如下:
public class Complex
{
[Key]
public Guid Id { get; set; }
public string Name { get; set; }
public Guid AddressId { get; set; }
[ForeignKey("AddressId")]
public virtual Address Address { get; set; }
public virtual ICollection<Unit> Units { get; set; }
public Complex()
{
this.Id = System.Guid.NewGuid();
this.Units = new HashSet<Unit>();
}
public void AddUnit(Unit unit)
{
Units.Add(unit);
}
}
public class Unit
{
[Key]
public Guid Id { get; set; }
public string Name { get; set; }
public Guid ComplexId { get; set; }
[ForeignKey("ComplexId")]
public virtual Complex Complex { get; set; }
public virtual ICollection<Tenant> Tenants { get; set; }
public Unit()
{
this.Id = System.Guid.NewGuid();
this.Tenants = new HashSet<Tenant>();
}
public void AddTenant(Tenant tenant)
{
Tenants.Add(tenant);
}
}
public class Tenant
{
[Key]
public Guid Id { get; set; }
public string UserId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public Guid ContactInfoId { get; set; }
[ForeignKey("ContactInfoId")]
public ContactInfo ContactInfo { get; set; }
public virtual ICollection<Unit> Units { get; set; }
public Tenant()
{
this.Id = System.Guid.NewGuid();
this.Units = new HashSet<Unit>();
}
}
public class Address
{
[Key]
public Guid Id { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
public Address()
{
this.Id = System.Guid.NewGuid();
}
}
public class ContactInfo
{
[Key]
public Guid Id { get; set; }
public Guid AddressId { get; set; }
[ForeignKey("AddressId")]
public Address Address { get; set; }
public string Phone1 { get; set; }
public string Phone2 { get; set; }
public string Email { get; set; }
public ContactInfo()
{
this.Id = System.Guid.NewGuid();
}
}
编辑:我通过添加modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
解决了错误
但我仍然不能完全理解它的影响和/或它是如何工作的 - 或者这是否是我需要使用的。
答案 0 :(得分:0)
ICollection用于定义实体之间的一对多或多对多关系。在“复杂”类中,您已定义ICollection“Unit”。但是,Complex类中没有定义外键属性“UnitId”,它映射到Unit实体的主键。实体框架将Complex类的“Id”映射到Unit类的“Id”。 (假设:单位,复合体和租户的ID不同)。这可能是错误背后的原因。定义“UnitId”属性并将“外键”属性添加到“单元”集合。同样,修复您的租户和单元类。