Как MS Entity Framework отображает концептуальную модель на типы CLR?
Учитывая модель данных объекта (EDMX) со "стратегией генерации кода", установленной на "Нет", как EF определяет, с какими типами CLR сопоставить концептуальную модель?
Я думаю, что где-то читал, что он просто исследует сборку для типов, которые соответствуют концептуальной модели, но это было в отношении CTP-версии EF. Это все еще так? Могу ли я как-то контролировать этот процесс?
В частности, я нахожусь в сценарии, где я перемещаю существенную кодовую базу от использования Linq2SQL к использованию POCO с EF 4.0. Таким образом, у меня есть классы Linq2SQL, а также мои классы POCO, которые сейчас находятся в одной сборке, но в разных пространствах имен. Я пытаюсь плавно перейти от L2S к EF, поэтому я хотел бы, чтобы две платформы работали параллельно некоторое время. Тем не менее, я получаю сообщение об ошибке выполнения
Отображение типа CLR в тип EDM неоднозначно, поскольку несколько типов CLR соответствуют типу EDM SomeType. Ранее найденный тип CLR "SomeNamespace.SomeType", недавно найденный тип CLR "SomeNamespace.POCO.SomeType"
где SomeNamespace - пространство имен объектов L2S. Эта ошибка имеет смысл, если EF просто проверяет все типы, соответствующие концептуальной модели. Могу ли я ограничить EF только проверкой пространства имен SomeNamespace.POCO? Или я должен поместить свои объекты POCO в другую сборку? Или я должен принять третий подход?
Спасибо.
1 ответ
Обратите внимание на этот комментарий из блога команды ADO.NET:
Джефф 25 февраля 2010 9:10 @Derek
Это намеренно. Вы можете поместить свои классы POCO в любое пространство имен, которое захотите. Механизм Entity Framework по соглашению для определения того, какие свойства объекта соответствуют свойствам объектов в вашей модели, не использует пространство имен. Важно то, что имя типа (без пространства имен) совпадает с именем EntityType в вашей модели (файл edmx/csdl).
Одна область, на которую стоит обратить внимание, - это если у вас есть несколько типов с одинаковыми именами, но в разных пространствах имен. Поскольку мы не учитываем пространство имен, мы обнаруживаем, что мы нашли несколько типов, и мы генерируем исключение.
Джефф
Смотрите эту статью: текст ссылки