实体框架有许多到多个级联约束

时间:2017-08-28 09:05:25

标签: entity-framework ef-code-first

错误:介绍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>();解决了错误 但我仍然不能完全理解它的影响和/或它是如何工作的 - 或者这是否是我需要使用的。

1 个答案:

答案 0 :(得分:0)

ICollection用于定义实体之间的一对多或多对多关系。在“复杂”类中,您已定义ICollection“Unit”。但是,Complex类中没有定义外键属性“UnitId”,它映射到Unit实体的主键。实体框架将Complex类的“Id”映射到Unit类的“Id”。 (假设:单位,复合体和租户的ID不同)。这可能是错误背后的原因。定义“UnitId”属性并将“外键”属性添加到“单元”集合。同样,修复您的租户和单元类。