【发布时间】:2019-11-27 03:30:27
【问题描述】:
我有一个实体类型 MyEntity,它有一个主键 string MyEntityCode
我想创建第二个实体MyEntityInfo,它是一些MyEntity 逻辑关联的扩展属性。
这使得这些实体之间的关系是一对一的,一端是可选的——MyEntity 逻辑上可选地有一个MyEntityInfo,没有导航属性,而MyEntityInfo 需要有一个@987654329 @(带有导航属性)。
我想在 SQL 中将其编码为 MyEntityInfo,它的主键 BaseEntityCode 也是 MyEntity 的 MyEntityCode 的外键。
如何在 EF6 fluent 配置 API 中配置此编码。
示例代码
public class MyEntity {
public string MyEntityCode {get; set;}
public int SomeProperty {get; set;}
}
public class MyEntityInfo {
public MyEntity BaseEntity {get; set;}
public string BaseEntityCode {get; set;}
public int OtherInfo {get; set;}
}
public MyEntityConfiguration : EntityConfiguration<MyEntity> {
public MyEntityConfiguration(){
HasKey(e => e.MyEntityCode);
}
}
我以为我可以将MyEntityInfo 配置为
public MyEntityInfoConfiguration : EntityConfiguration<MyEntityInfo> {
public MyEntityInfoConfiguration(){
HasKey(e => e.BaseEntityCode);
HasRequired(e => e.BaseEntity).WithOptional().WithForeignKey(e => BaseEntityCode);
}
}
但WithOptional() 不允许链接到WithForeignKey
做同样的事情,但使用WithMany() 使得外键成为可能,违反了一个的多重性约束:
因为Dependent Role指的是关键属性,所以Dependent Role的重数上限必须为'1'。
【问题讨论】:
-
为什么不让 MyEntity 作为 MyEntityInfo 的基类?
-
@Neil.Work 我不喜欢使用类继承来编码数据之间的关系。如果这是获得我想要的架构的唯一方法,那么它就是这样,但编码很少比组合替代 IMO 具有优势。
-
@Neil.Work 在这个具体的例子中,改变一个现有的 MyEntity,并添加 MyEntityInfo 似乎很麻烦。您需要一个新实例,因为您需要构造一个新的子类型来替换旧的超类型。
标签: entity-framework entity-framework-6