我试图使用一个公共(public)的EntityTypeConfiguration类来为我的所有实体配置主键,以便每个派生的配置类都不会重复自己。我所有的实体都实现一个公共(public)接口(interface)IEntity(表示每个实体必须具有int类型的Id属性)。
我的配置基类如下所示:
public class EntityConfiguration<TEntity> : EntityTypeConfiguration<TEntity>
where TEntity : class , IEntity {
public EntityConfiguration() {
HasKey( e => e.Id );
Property( e => e.Id ).HasDatabaseGeneratedOption( DatabaseGeneratedOption.Identity );
}
}
然后,每个实体都有自己的特定配置类,将其扩展为如下所示:
public class CustomerConfiguration : EntityConfiguration<Customer> {
public CustomerConfiguration() : base() {
// Entity specific configuration here
}
}
它可以很好地编译,但是我遇到的问题是,在运行时我遇到以下异常,当EF 4.1 RC尝试创建模型时,将引发以下异常:
如果我将CustomerConfiguration类更改为从EntityTypeConfiguration 扩展并重复主键配置,则它可以正常工作,但是我失去了共享通用配置的能力(DRY主体是动机)。
作为引用,下面是其他涉及的类:
public interface IEntity {
int Id { get; set; }
}
public class Customer : IEntity {
public virtual int Id { get; set; }
public virtual string name { get; set; }
}
谢谢!
最佳答案
我认为您不需要经历所有这些事情。 EF 4.1 Code First在配置上使用了很多约定,通过它,实体的Id属性被配置为主键。因此,通过在您的实体上实现IEntity接口(interface),您可以使用ID作为主键来设置它们。
这是ADO.NET团队博客的链接,该链接解释了主键约定的工作方式-Conventions for Code First