我正在尝试获得多个"单位"有一套" 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; }
}
我确定这是一个简单的错误,我无法弄明白。
我做错了什么?
答案 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