我尝试使用通用的 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 );
}
}
然后,每个实体都有其自己的特定配置类,如下所示扩展该配置类:
public class CustomerConfiguration : EntityConfiguration<Customer> {
public CustomerConfiguration() : base() {
// Entity specific configuration here
}
}
它编译得很好,但我遇到的问题是,在运行时,当 EF 4.1 RC 尝试创建模型时,我收到以下异常:
System.InvalidOperationException 是
未处理的消息=关键组件
“Id”不是声明的属性
输入“客户”。验证它是否有
没有被明确排除在外
模型并且它是一个有效的原语
财产。来源=EntityFramework
如果我将 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; }
}
Thanks!
看起来这些配置在接口上存在一些问题。如果你改变它就会起作用IEntity
to 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()
{
...
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)