EF6如何映射这种零或一对一关系

EF6 how to map this zero or one to one relationship

这是代码优先。

此关系的正确 Fluent 或数据注释是什么?

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

如果我加上

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

我收到此错误: 在模型生成期间检测到一个或多个验证错误:School_SchoolInfo_Target::多重性在关系 'School_SchoolInfo' 中的角色 'School_SchoolInfo_Target' 中无效。由于 Dependent Role 属性不是关键属性,因此 Dependent Role 的重数上限必须为“*”。

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
}

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

如果你想实现 1:1 映射,tables 应该是这样的:

在这种情况下,您的实体 类 将如下所示:

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; }
}

您当前的 table 结构建议 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; }
}