实体框架4.1 RC:Code First EntityTypeConfiguration继承问题

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

看起来这些配置有一些接口问题.如果您更改IEntityEntityBase:

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)


Pai*_*ook 2

我认为你不需要经历这一切。EF 4.1 Code First 使用了大量配置约定,通过这种方式,实体的 Id 属性被配置为主键。因此,通过在实体上实现 IEntity 接口,您可以使用 Id 作为主键来设置它们。

以下是 ADO.NET 团队博客的链接,其中解释了主键约定的工作原理 - Conventions for Code First

  • 是的,确实如此,但就我个人而言,我不喜欢依赖约定,并且在可能的情况下,我希望配置明确、自记录并处于版本控制之下。迟早有些事情可能不符合惯例,因此这些问题应该可以预先解决。这个简化示例中还没有显示一些共享配置,我不确定约定是否会自动处理。 (7认同)