Я только что установил шаблон POCO для EF4. У меня есть один объект в моей модели, AnnouncementText , и файлы T4, похоже, созданы правильно. Попытка доступа к этому новому объекту вызывает следующую ошибку, когда я получаю доступ к автоматически сгенерированному свойству MyObjectContext.AnnouncementTexts
:
InvalidOperationException: не удалось найти информацию сопоставления и метаданных для EntityType 'MyNamespace.AnnouncementText'.
Кажется, что свойства в AnnouncementText
POCO совпадают со столбцами в базе данных, и я не изменил автоматически сгенерированный код.
Трассировка стека:
at System.Data.Objects.ObjectContext.GetTypeUsage(Type entityCLRType)
at System.Data.Objects.ObjectContext.GetEntitySetForNameAndType(String entitySetName, Type entityCLRType, String exceptionParameterName)
at System.Data.Objects.ObjectContext.CreateObjectSet[TEntity](String entitySetName)
at MyNamespace.MyObjectContext.get_AnnouncementTexts() in C:\<snip>\MyObjectContext.Context.cs:line 65
at MyNamespace.Class1.Main() in C:\<snip>\Class1.cs:line 14
Если я удаляю файлы .tt
из решения и .tt
генерацию кода в модели, я получаю доступ к свойству без проблем.
Вот мой код, на случай, если это может помочь:
using (var context = new MyObjectContext())
foreach (var at in context.AnnouncementTexts)
Console.WriteLine(at.Title);
Есть идеи, что может быть не так?
Недавно я снова столкнулся с этой же ошибкой при перемещении файла EDMX в новое место в решении. Очевидно, при работе с файлами EDMX существует несколько разных пространств имен. Существует пространство имен, которое вы вводите с помощью мастера при создании исходного файла EDMX (N1), другого, который появляется в SSDL, который выглядит примерно так (N2):
<Schema Namespace="..." ..
Затем есть пространство имен сгенерированного кода, которое (необязательно) может быть указано в конструкторе (N3), и, наконец, есть скрытые пространства имен ресурсов, которые скомпилированы в окончательную сборку (N4).
Из того, что я могу сказать, пространство имен N2 действительно актуально только внутри SSDL. Я считаю, что это пространство имен начинается как N1 - то, которое вы изначально вводите в мастере.
Точно так же пространство имен N3 имеет отношение только к тому, как это обычно делают пространства имен C #.
Вот проблемная часть. Пространства имен категории N4 являются функцией каталога, в котором находится ваш EDMX (относительно каталога вашего проекта). Вы можете подумать, ну и что? Оказывается, эти пространства имен также упоминаются в вашем файле App.config! В частности, ищите такую часть:
connectionString="metadata=res://*/Database.Master.csdl|...
Эта часть, читающая «Database.Master.csdl», является названием вашего ресурса CSDL. Если имена этих ресурсов не синхронизированы, вы получите сообщение об ошибке, подобное приведенному выше, или, возможно,:
Указанное имя EntityContainer по умолчанию '[name]' не найдено в информации о сопоставлении и метаданных.
Простое решение состоит в том, чтобы изменить ваш App.config, указав правильное имя ресурса для каждой части вашего отображения EF (CSDL, SSDL и MSL). Если вы точно не знаете, каковы эти имена, проверьте ресурсы вашей скомпилированной сборки в ILSpy или dotPeek .
Если вы скопируете файл EDMX в другой проект, действие «Построение» (на панели «Свойства») вернется к значению по умолчанию «Нет» в целевом проекте, что может вызвать ошибку «Имя EntityContainer ... не удалось найти» , потому что ресурсы не генерируются. (Если это так, то при открытии библиотеки DLL, содержащей модель, в Reflector ресурсов не будет.) Если для параметра «Действие построения» задано значение «EntityDeploy» и перестроить решение, это исправит это.