Наследование таблицы для каждой иерархии с помощью объектов POCO в Entity Framework 4

StackOverflow https://stackoverflow.com/questions/1856869

Вопрос

Наша организация стремится стандартизировать Entity Framework, как только выйдет версия 4.В результате я рассматриваю, что потребуется для переноса нашего приложения, которое использует NHibernate для сохранения, на EF4 с использованием поддержки POCO.В паре мест мы используем наследование одной таблицы (также известное как Таблица на иерархию).Я не смог заставить его работать, используя следующее.

Payment (базовый класс [должен быть абстрактным, но и там возникают проблемы]) CreditCardPayment (конкретная реализация) ACHPayment (конкретная реализация) CheckPayment (конкретная реализация)

Прямо сейчас я сопоставляю их только со свойствами базового класса.Все эти классы находятся в одном пространстве имен.У них есть распознаватель, который называется PaymentTypeId в базе данных, поэтому сопоставление платежей имеет условие "Когда PaymentTypeId = 0".Каждый из подклассов имеет одно и то же условие с разными значениями (т.е.Платеж кредитной картой = 1 и т.д.).

Когда я пытаюсь загрузить каждый список всех платежей с помощью DataContext.Payments.ToList() (DataContext наследуется от ObjectContext) Я получаю следующее исключение:

"Не удалось найти сопоставление объектов для типа с идентификатором 'dataLayer.DataModel.Оплата кредитной картой'".

Я не могу понять, что это значит, поскольку класс POCO CreditCardPayment находится в том же пространстве имен, что и класс POCO Payment (фактически в том же файле).

Что я упускаю из виду?

Это было полезно?

Решение 2

То, чего я раньше не представлял (я не думал, что это имеет значение, но это было).Был ли этот CreditCardPayment унаследован от промежуточного класса с именем "CreditPayment", а ACHPayment унаследован от CashPayment.CreditCardPayment и CashPayment находятся в одном пространстве имен и файле, но не были представлены в сопоставлении EF.Как только я добавил их в файл сопоставления, все заработало нормально.

Итак, даже несмотря на то, что EF никогда не сопоставляется ни с одним из этих типов напрямую, похоже, ему нужно знать о них, потому что он изменяет базовый тип классов CreditCardPayment и др.Спасибо вам за вашу помощь в этом.

Другие советы

Это жалоба не на сопоставление базы данных, а на сопоставление модели с CLR.

EF по какой-то причине не может найти ваш CreditCardPayment класс.

Теперь одна из возможных причин заключается в том, что вы еще не загрузили метаданные для него.

Например, если у вас есть это:

Assembly 1:
 - Payment

Assembly 2 references Assembly 1:
 - CreditCardPayment extends Payment

Затем, когда вы запрашиваете, EF не знает, где находится CreditCardPayment.

Способ обойти это - с помощью LoadAssembly, то есть:

using (DataContext ctx = new DataContext())
{
   ctx.MetadataWorkspace.LoadFromAssembly(typeof(CreditCardPayment).Assembly);

   // now do your query.

}

Вам нужно сказать, чтобы LoadFromAssembly каждая сборка, на которую непосредственно не ссылается ваш DataContext класс.

Примечание: typeof(Payment).Assembly на него прямо ссылаются из- за IQueryable<Payment> Собственность платежей.

Надеюсь, это поможет

Алекс

Майкрософт.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top