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; }
}
这是代码优先。
此关系的正确 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; }
}