Ошибка переопределения кода EF Первый дискриминатор TPH - PullRequest
3 голосов
/ 29 марта 2012

Я пытаюсь переназначить столбец дескриптора моей сохраненной TPH иерархии объектов, как описано в:

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

Когда я сопоставляю, используя один из следующих вариантов:

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"
  • Удалить оператор Map для MyBase

Я получаю сообщение об ошибке:

Карта была вызвана более одного раза длявведите 'DerivedA', и хотя бы один из вызовов не указал имя целевой таблицы.

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

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

Что я делаю не так?

1 Ответ

7 голосов
/ 05 апреля 2012

Это исправлено в EF5-бета2, где должны работать связанные вызовы 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)); 

Обратите внимание на вызовы Entity<DerivedA>, Entity<DerivedB> и т. Д., А не на все Entity<MyBase>.

...