1

我正在使用 Entity Framework Code First 在 ASP.NET MVC 4 中构建一个应用程序,为简单起见,我从具有 Guid、DateCreated、LastEditDate 和其他的 BaseEntity 继承将存储在数据库中的所有模型像这样有用的属性。现在,我知道我可以告诉 EF 像这样映射这些继承的属性:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>().Map(m =>
    {
        m.MapInheritedProperties();
    });

    modelBuilder.Entity<Product>().Map(m =>
    {
        m.MapInheritedProperties();
    });            
}

不过,对每个项目都这样做似乎很愚蠢。有没有办法可以将此规则应用于所有实体?

4

2 回答 2

1

这样的映射 - 称为Table-Per-Concrete-Type (TPC) 继承映射 - 只有在您真的想要利用多态性时才有意义,例如,如果您想要加载一个包含 10 个BaseEntity对象的列表并期望实际类型被物化因此列表包含 3 个User实体和 7 个Product实体。

这样的查询是否会在您的应用程序中具有任何业务相关性?看着你的BaseEntity我只能看到查询所有对象 - 例如 - 在特定日期创建的,无论对象具有哪种类型(如果它派生自BaseEntity),可能很有用。你需要那个吗?还要记住这样的查询有多复杂。SQL 必须查询数据库中几乎所有的表,然后合并结果。

只有当它具有真正的商业意义时,我才会使用继承映射(例如:Person它本身具有有意义的属性,如地址、电话、电子邮件等,并且Employee源自Person并添加了SalaryHiredDate​​属性等)。

在您的情况下,我将使用BaseEntityonly 作为您的实体类的基本类型,并且根本不为此类指定任何映射。EF 仍然会映射继承的属性,但作为UserandProduct实体等的一部分,而不是作为自己的实体。我什至不会称它为“基础实体”,但......我不知道......也许EntityBase(意思是:所有实体的基础(类),但不是实体本身)。

于 2013-03-22T20:31:29.577 回答
0

已经正确地指出,在这种特定情况下没有必要进行全局映射,因为只要您不BaseEntity参与模型,EF 就会为每个单独的类型映射属性。

EntityTypeConfiguration但是您的问题标题更笼统,是的,如果您通过s配置映射,则可以指定全局映射规则。它可能看起来像这样:

// Base configuration.
public abstract class BaseMapping<T> : EntityTypeConfiguration<T>
  where T : BaseEntity
{
  protected BaseMapping()
  {
    this.Map(m => m.MapInheritedProperties()); // OK, not necessary, but
                                               // just an example
  }
}

// Specific configurations
public class UserMapping : BaseMapping<User>
{ }

public class ProductMapping : BaseMapping<Product>
{ }

public class TempModelsContext : DbContext
{
  // Add the configurations to the model builder.
  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
    base.OnModelCreating(modelBuilder);
    modelBuilder.Configurations.Add(new UserMapping());
    modelBuilder.Configurations.Add(new ProductMapping());
  }

  // DbSets
  ...
}

笔记:

从 Entity Framework 6 开始,其中一些映射也可以通过自定义代码优先约定来解决:http ://romiller.com/2013/01/29/ef6-code-first-configuring-unmapped-base-types/

于 2013-03-22T21:15:55.220 回答