Наследование таблицы для каждой иерархии с помощью объектов POCO в Entity Framework 4
-
13-09-2019 - |
Вопрос
Наша организация стремится стандартизировать 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>
Собственность платежей.
Надеюсь, это поможет
Алекс
Майкрософт.