Jam*_*mie 11 c# ef-code-first entity-framework-4.1
我正在尝试使用常见的EntityTypeConfiguration类来为我的所有实体配置主键,以便每个派生的配置类不会重复.我的所有实体都实现了一个公共接口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 );
}
}
Run Code Online (Sandbox Code Playgroud)
然后每个实体都有自己的特定配置类,扩展这个类,如下所示:
public class CustomerConfiguration : EntityConfiguration<Customer> {
public CustomerConfiguration() : base() {
// Entity specific configuration here
}
}
Run Code Online (Sandbox Code Playgroud)
它编译得很好,但我遇到的问题是,在运行时,当EF 4.1 RC尝试创建模型时,我会得到以下异常:
System.InvalidOperationException未处理Message =关键组件"Id"不是"Customer"类型的声明属性.验证它是否未从模型中明确排除,并且它是有效的原始属性.来源=的EntityFramework
如果我将CustomerConfiguration类更改为从EntityTypeConfiguration <Customer>扩展并重复主键配置,那么它工作正常,但我失去了共享通用配置的能力(DRY主体是动机).
这里参考的是其他涉及的类:
public interface IEntity {
int Id { get; set; }
}
public class Customer : IEntity {
public virtual int Id { get; set; }
public virtual string name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
Lad*_*nka 12
看起来这些配置有一些接口问题.如果您更改IEntity为EntityBase:
public class EntityBase
{
public virtual int Id { get; set; }
}
public class Customer : EntityBase
{
public virtual string Name { get; set; }
}
public class EntityConfiguration<TEntity> : EntityTypeConfiguration<TEntity>
where TEntity : EntityBase
{
public EntityConfiguration()
{
HasKey(e => e.Id);
Property(e => e.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
}
public class CustomerConfiguration : EntityConfiguration<Customer>
{
public CustomerConfiguration()
: base()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
我认为你不需要经历这一切。EF 4.1 Code First 使用了大量配置约定,通过这种方式,实体的 Id 属性被配置为主键。因此,通过在实体上实现 IEntity 接口,您可以使用 Id 作为主键来设置它们。
以下是 ADO.NET 团队博客的链接,其中解释了主键约定的工作原理 - Conventions for Code First
| 归档时间: |
|
| 查看次数: |
12808 次 |
| 最近记录: |