2017-01-23 72 views
0

我首先遇到继承代码问题。 我有基类,它是这样的:EF:使用流畅的API映射基类属性

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'。“如何避免定义密钥并只改变属性映射?我有派生类的关键。

+0

因此,你想为每个派生类定义单个的键,并使用“每个具体类的表”策略?然后,您应该在派生类实体上配置基类属性。 – grek40

+0

如果我理解正确,你没有使用** EF继承**,但简单的C#类继承? –

+0

是的,但我有很多派生类来一一配置它。这将会产生许多复制粘贴代码,我不想要它。它的更好的解决方案?是的,我有C#类继承,我尝试获得干净的模型,并获得一切流利的API。 – CrazyBaran

回答

1

你可以将你的基类配置包装在一个通用的方法中,并为每个具体的实体类型调用它。

static void ConfigureBaseEntity<TDerived>(EntityTypeConfiguration<TDerived> entityTypeConfiguration) where TDerived : BaseEntity 
{ 
    // your base class configuration 
    entityTypeConfiguration.HasOptional(x => x.UserCreated).WithMany().HasForeignKey(x => x.UserCreatedId); 
    entityTypeConfiguration.HasOptional(X => X.UserModified).WithMany().HasForeignKey(x => x.UserModifiedId); 
} 

呼吁每个具体的实体类型

public class DerivedEntity : BaseEntity 
{ 
    public int Id { get; set; } 
} 

//... 
ConfigureBaseEntity(modelBuilder.Entity<DerivedEntity>()); 

编辑

也许Types配置足以让你的目的。

modelBuilder.Types<BaseEntity>().Configure(entityTypeConfiguration => /* configure using entityTypeConfiguration */); 

否则,如评论,您可能需要反思。例如,可以说所有的派生类与BaseEntity类在同一个程序集中,上面的ConfigureBaseEntity方法在类BaseEntityConfiguration中。但是,如果它是我的代码,我更愿意为每个实体类编写一行代码,而不是用于动态发现。

+0

如果我有很多DerivedEntity,这个答案会产生如此多的复制粘贴代码,也许是一些更干净的方法来做到这一点? – CrazyBaran

+0

@CrazyBaran如果每个具体类的单线程对于您的情况非常重要,请随意使用反射或MEF之类的东西来收集派生类集合并创建我的代码的基于反射的版本。 – grek40

+0

@CrazyBaran看到我的编辑,也许这就是你需要的 – grek40

相关问题