【发布时间】:2017-01-23 12:40:05
【问题描述】:
我首先遇到了继承代码的问题。 我有如下所示的基类:
public abstract class BaseEntity
{
public DateTime? DateCreated { get; set; }
public string UserCreatedId { get; set; }
public DateTime? DateModified { get; set; }
public string UserModifiedId { get; set; }
public virtual UserState UserCreated { get; set; }
public virtual UserState UserModified { get; set; }
}
我继承了它,这给了我一个名为 UserCreated_userStateId 和 UserModified_UserStateId 的附加列。所以我尝试了这样的流利的 API:
modelBuilder.Entity<BaseEntity>().HasOptional(x => x.UserCreated).WithMany().HasForeignKey(x => x.UserCreatedId);
modelBuilder.Entity<BaseEntity>().HasOptional(X => X.UserModified).WithMany().HasForeignKey(x => x.UserModifiedId);
但这给了我错误:“在模型生成期间检测到一个或多个验证错误:
BaseEntity: : EntityType 'BaseEntity' 没有定义键。定义此 EntityType 的键。 BaseEntities: EntityType: EntitySet 'BaseEntities' 基于没有定义键的类型 'BaseEntity'。”如何避免定义键而只更改属性映射?我在派生类中有键。
【问题讨论】:
-
那么您想为每个派生类定义单独的键并使用“每个具体类的表”策略吗?然后你应该在派生类实体上配置基类属性。
-
如果我理解正确,你使用的不是EF继承,而是简单的C#类继承?
-
是的,但是我必须有很多派生类来一一配置。这会产生很多复制粘贴代码,我不想要它。它有更好的解决方案吗?是的,我有 C# 类继承,我尝试获取干净的模型并在 fluent API 中获取所有内容。
-
通常这不需要任何配置。如果 EF 创建其他列,则必须存在类型不匹配 -
UserState类的 PK 属性的 type 是什么? -
PK 的类型是字符串,但我需要告诉 EF 哪个字符串属性需要是哪个 userState 的 FK,你可以看到我有两个。通常,当我将 FK 命名为 UserStateId 时,EF 会从类名中获取它。
标签: c# entity-framework