重新映射EF Code First TPH Discriminator时出错

Eri*_* J. 3 ef-code-first entity-framework-4.3

我正在尝试重新映射我的TPH持久对象层次结构的descriminator列,如下所述:

http://msdn.microsoft.com/en-us/library/hh295845(v=vs.103).aspx

http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-fluent-api-samples.aspx

/sf/answers/465504511/

当我使用以下任一变体进行映射时:

modelBuilder.Entity<MyBase>()
            .Map<MyBase>(m => m.Requires("TypeId").HasValue(0))
            .Map<DerivedA>(m => m.Requires("TypeId").HasValue(1))
            .Map<DerivedB>(m => m.Requires("TypeId").HasValue(2))
            .Map<DerivedC>(m => m.Requires("TypeId").HasValue(3))
            .Map<DerivedD>(m => m.Requires("TypeId").HasValue(4));
Run Code Online (Sandbox Code Playgroud)

要么

modelBuilder.Entity<MyBase>()
            .Map<MyBase>(m => m.Requires("TypeId").HasValue(0));
modelBuilder.Entity<MyBase>()
            .Map<DerivedA>(m => m.Requires("TypeId").HasValue(1));
modelBuilder.Entity<MyBase>()
            .Map<DerivedB>(m => m.Requires("TypeId").HasValue(2));
modelBuilder.Entity<MyBase>()
            .Map<DerivedC>(m => m.Requires("TypeId").HasValue(3));
modelBuilder.Entity<MyBase>()
            .Map<DerivedD>(m => m.Requires("TypeId").HasValue(4));
Run Code Online (Sandbox Code Playgroud)

有以下变化:

  • 使用字符串而不是整数,例如"1"
  • 删除MyBase的Map语句

我收到错误:

类型'DerivedA'多次调用Map,并且至少有一个调用没有指定目标表名.

所有派生类都直接从MyBase继承,所有派生类都包含在映射中.

我正在使用Entity Framework 4.3.1.

我究竟做错了什么?

Art*_*ers 7

这在EF5-beta2中得到修复,其中链接的Map调用应该起作用.

在EF 4.3中,您需要将每个Map调用拆分为EntityTypeConfiguration ,以用于它应用的实体类型.

modelBuilder.Entity<MyBase>() 
        .Map<MyBase>(m => m.Requires("TypeId").HasValue(0)); 
modelBuilder.Entity<DerivedA>() 
        .Map<DerivedA>(m => m.Requires("TypeId").HasValue(1)); 
modelBuilder.Entity<DerivedB>() 
        .Map<DerivedB>(m => m.Requires("TypeId").HasValue(2)); 
modelBuilder.Entity<DerivedC>() 
        .Map<DerivedC>(m => m.Requires("TypeId").HasValue(3)); 
modelBuilder.Entity<DerivedD>() 
        .Map<DerivedD>(m => m.Requires("TypeId").HasValue(4)); 
Run Code Online (Sandbox Code Playgroud)

注意调用Entity<DerivedA>,Entity<DerivedB>等等而不是全部Entity<MyBase>.