多个0..1关系到同一个表实体框架代码首先

时间:2016-12-06 10:45:11

标签: c# entity-framework ef-code-first entity-framework-6

我正在尝试获得多个"单位"有一套" UnitInfo"已分配,但在首次使用代码时,我从EF收到以下消息:

  

在模型生成期间检测到一个或多个验证错误:   Unit_UnitInfo_Source :: Multiplicity在Role' Unit_UnitInfo_Source'中无效。 in relationship' Unit_UnitInfo'。由于Dependent Role属性不是关键属性,因此Dependent Role的多重性的上限必须为' '。   SubUnit_UnitInfo_Source :: Multiplicity在Role&Subcenit_UnitInfo_Source'中无效。 in relationship' SubUnit_UnitInfo'。由于Dependent Role属性不是关键属性,因此Dependent Role的多重性的上限必须为' '。

我使用的类看起来像这样:

public class Unit
{
    public int UnitId { get; set; }
    public string Name { get; set; }
    public List<SubUnit> SubUnits { get; set; }

    [ForeignKey("UnitInfoId")]
    public UnitInfo UnitInfo { get; set; }
}

public class SubUnit
{
    public int SubUnitId { get; set; }
    public string Name { get; set; }

    [ForeignKey("UnitInfoId")]
    public UnitInfo UnitInfo { get; set; }
}

public class UnitInfo
{
    public int UnitInfoId { get; set; }
    public string Function { get; set; }
    public string Location { get; set; }
}

我确定这是一个简单的错误,我无法弄明白。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

[ForeignKey()]属性应该引用外键或同一类中的navigation属性。因此,UnitInfoId应该是您指定导航属性和[ForeignKey()]属性的类的成员。

导航属性应该是虚拟的,以便允许EF为延迟加载创建代理类。如果不使用流畅的api,则应为主键指定[Key]属性。此外,参考集合应声明为虚拟ICollection成员。您需要的架构可以声明如下:

public class Unit
{
    public Unit()
    {
        SubUnits = new HashSet<SubUnit>();
    }

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UnitId { get; set; }
    public string Name { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<SubUnit> SubUnits { get; set; }

    public int UnitInfoId { get; set; }

    [ForeignKey("UnitInfoId")]
    public virtual UnitInfo UnitInfo { get; set; }
}

public class SubUnit
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int SubUnitId { get; set; }
    public int UnitId { get; set; }
    public string Name { get; set; }

    [ForeignKey("UnitId")]
    public virtual Unit ParentUnit { get; set; }

    public int UnitInfoId { get; set; }
    [ForeignKey("UnitInfoId")]
    public UnitInfo UnitInfo { get; set; }
}

public class UnitInfo
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UnitInfoId { get; set; }
    public string Function { get; set; }
    public string Location { get; set; }
}

但是,我建议使用继承,因为Unit和SubUnit共享相同的结构。您可以先了解有关EF代码的更多信息HERE