EF6如何映射此零或一对一关系

时间:2016-05-23 14:58:52

标签: c# sql .net entity-framework fluent

这是Code-First。

这种关系的正确流利或数据注释是什么?

获取EF映射错误: 无法确定类型之间的关联的主要结束' Model.SchoolInfo'和' Model.School'。必须使用关系流畅API或数据注释显式配置此关联的主要结尾。

如果我添加

modelBuilder.Entity<School>().HasOptional(s => s.SchoolInfo).WithRequired(ss => ss.School);

我收到此错误: 在模型生成期间检测到一个或多个验证错误:School_SchoolInfo_Target :: Multiplicity在Role&School_SchoolInfo_Target&#39;在关系&school; School_SchoolInfo&#39;。由于“从属角色”属性不是关键属性,因此从属角色的多重性的上限必须为“&#39; *&#39;”。

SQL表

table School
(
    int SchoolId not null PK
)

table SchoolInfo
(
    int SchoolInfoId not null PK IDENTITY
    int SchoolId not null FK UNIQUE
)

模型

class School
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    int schoolId;

    virtual SchoolInfo SchoolInfo;
}

class SchoolInfo
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    int schoolInfoId;

    int schoolId;

    virtual School School
}

2 个答案:

答案 0 :(得分:3)

如果您想实施 1:1映射,这就是表格的样子:

Schools

SchoolInfoes

在这种情况下你的实体类看起来像这样:

public class School
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int SchoolId { get; set; }

    public virtual SchoolInfo SchoolInfo { get; set; }
}

public class SchoolInfo
{
    [ForeignKey("School")]
    public int SchoolInfoId { get; set; }

    public virtual School School { get; set; }
}

您当前的表格结构建议 1:M映射,为了将实体类映射到它,您需要做一些小改动:

public class School
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int SchoolId;

    public virtual IList<SchoolInfo> SchoolInfoes { get; set; }
}

public class SchoolInfo
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int SchoolInfoId { get; set; }

    public int SchoolId { get; set; }

    public virtual School School { get; set; }
}

答案 1 :(得分:0)

您可以考虑审核您的实体关系数据模型。尝试删除SchoolInfoId字段(您实际上并不需要它),只需使用学校ID FK作为PK。这将使您的数据模型保持一致。