Error redefining EF code First TPH discriminator

I am trying to reassign the descriminator column of my TPH persistent object hierarchy as described in:

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

stack overflow

When I match one of the following:

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));

      

or

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));

      

With the following options:

  • Use a string, not an integer, eg. "1"
  • Remove map expression for MyBase

I am getting the error:

The map was called more than once for type "DerivedA" and at least one of the calls did not specify the name of the target table.

All derived classes inherit directly from MyBase, and all derived classes are included in the display.

I am using Entity Framework 4.3.1.

What am I doing wrong?

+3


source to share


1 answer


This is fixed in EF5-beta2, where calls with a chain of cards should work.

In EF 4.3, you need to split each call to the map into an EntityTypeConfiguration for the entity type it applies to.



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)); 

      

Pay attention to calls Entity<DerivedA>

, Entity<DerivedB>

etc., not everything on Entity<MyBase>

.

+7


source







All Articles