2012-03-28 1 views
3

Я пытаюсь переназначить столбец descriminator моего TPH-сохранялось иерархии объектов, как описано в:Ошибка Переотображение EF Code First Тф Дискриминатор

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

When Я использую один из следующих вариантов:

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

или

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

со следующими изменениями:

  • Использование строки, а не целым числом, например «1» Заявление Карта
  • Удалить для MyBase

Я получаю ошибку:

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

Все производные классы наследуют непосредственно из MyBase, и все производные классы включены в отображении.

Я использую Entity Framework 4.3.1.

Что я делаю неправильно?

ответ

7

Это исправлено в EF5-beta2, где должны выполняться вызовы с привязкой к карте.

В EF 4.3 вам необходимо разделить каждый вызов карты на 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)); 

Обратите внимание на призывы к Entity<DerivedA>, Entity<DerivedB>, и так далее, а не все Entity<MyBase>.

+0

Хороший звонок! Спасибо за обходной путь! – Scott