2012-03-28 6 views
3

Ich versuche, die descriminator Spalte meiner TPH-beharrte Objekthierarchie neu zuordnen wie bei beschrieben:Fehler Remapping EF-Code Erste TPH Diskriminatorfilter

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

https://stackoverflow.com/a/6650064/141172

Wenn Ich kartiere mit einer der folgenden Varianten:

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

oder

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

mit den folgenden Variationen:

  • Verwenden Zeichenfolge anstatt ganze Zahl, z.B. "1"
  • Remove Map-Anweisung für MyBase

bekomme ich den Fehler:

Map was called more than once for type 'DerivedA' and at least one of the calls didn't specify the target table name.

Alle abgeleiteten Klassen erben direkt von MyBase und alle abgeleiteten Klassen sind in der Abbildung enthalten.

Ich benutze Entity Framework 4.3.1.

Was mache ich falsch?

Antwort

7

Dies ist in EF5-Beta2 behoben, wo die verketteten Map-Aufrufe funktionieren sollten.

In EF 4.3 müssen Sie jeden Map-Aufruf auf eine EntityTypeConfiguration für den Entitätstyp aufteilen, für den er gilt.

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

Beachten Sie die Anrufe zu Entity<DerivedA>, Entity<DerivedB>, und so weiter, anstatt alle zu Entity<MyBase>.

+0

Guter Anruf! Danke für die Problemumgehung! – Scott