"Информация метаданных не найдена" при использовании шаблона EF4 POCO?
Я только что установил шаблон 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
из решения и включит генерацию кода на модели, я могу получить доступ к этому свойству без проблем.
Здесь мой код, если это может помочь:
using (var context = new MyObjectContext())
foreach (var at in context.AnnouncementTexts)
Console.WriteLine(at.Title);
Любые идеи о том, что может быть неправильным?
Ответы
Ответ 1
Недавно я снова столкнулся с этой же ошибкой при перемещении моего EDMX файла в новое место в решении. По-видимому, существует несколько разных пространств имен при работе с файлами EDMX. Существует пространство имен, которое вы вводите через мастер при создании исходного файла EDMX (N1), другого, который появляется в SSDL, который выглядит примерно так (N2):
<Schema Namespace="..." ..
Затем существует пространство имен сгенерированного кода, которое может (необязательно) указываться в конструкторе (N3), и, наконец, есть скрытые пространства имен ресурсов, которые скомпилированы в вашу окончательную сборку (N4).
Из того, что я могу сказать, пространство имен N2 действительно актуально внутри SSDL. Я считаю, что это пространство имен начинается как N1 - тот, который вы изначально ввели в мастер.
Аналогично, пространство имен N3 имеет смысл только в том, как обычно существуют пространства имен С#.
Здесь проблема. Пространства имен категорий N4 - это функция каталога, в котором находится ваш EDMX (относительно вашего каталога проекта). Вы можете подумать, ну и что? Оказывается, эти пространства имен также упоминаются в вашем файле App.config! В частности, найдите такую часть:
connectionString="metadata=res://*/Database.Master.csdl|...
Эта часть, читающая "Database.Master.csdl", является именем вашего ресурса CSDL. Если эти имена ресурсов не синхронизированы, вы получите сообщение об ошибке, подобное приведенному выше, или, возможно,:
Указанное имя EntityContainer по умолчанию '[name]' не может быть найдено в данных сопоставления и метаданных.
Простым решением является изменение вашего App.config, чтобы указать правильное имя ресурса для каждой части вашего EF-сопоставления (CSDL, SSDL и MSL). Если вы точно не знаете, что такое эти имена, ознакомьтесь с вашими собранными ресурсами сборки в ILSpy или dotPeek.
Ответ 2
Если вы скопируете файл EDMX в другой проект, действие сборки (на панели "Свойства" ) вернется к значению по умолчанию "Нет" в целевом проекте, что может привести к тому, что имя "EntityContainer... не может быть найденной", потому что ресурсы не генерируются. (Если это так, когда вы открываете DLL, содержащую модель в Reflector, ресурсов не будет.) Установка действия Build на "EntityDeploy" и перестройка решения исправит это.
Ответ 3
Не уверен в этом... это кажется немного странным, так что это длинный выстрел.
Но иногда возникает вызов ObjectContext.MetadataWorkspace.LoadFromAssembly().
И даже если этого не происходит, есть вторая перегрузка, которая обеспечивает вывод стиля трассировки.
то есть.
Assembly assembly = typeof(AnnouncementText).Assembly;
context.MetadataWorkspace.LoadFromAssembly(
assembly,
(message) => Console.WriteLine(message)
);
foreach(var at in context.AnnouncementTexts)
...
И посмотрите, какие сообщения вы получите (если есть).
Надеюсь, что это поможет
Алекс
Ответ 4
В обозревателе решений щелкните правой кнопкой мыши файл модели данных сущности (.edmx) и нажмите "Открыть с помощью". Откроется диалоговое окно, чтобы выбрать программу для открытия файла.
Выберите или Дважды щелкните "Редактор XML (текст)".
Теперь вы просматриваете XML-версию файла EDM, где вы можете легко редактировать имя EntityContainer.
Если вы изменили строку соединения в файле webconfig, убедитесь, что "DefaultContainerName" является именем в разделе "EntityContainer" в этом файле XML.
Обычно, когда вы обновляете defaultContainerName в файле *.Designer.cs, он не обновляет XML файл. Таким образом, вы делаете это вручную.
Ответ 5
Я расширяю NopCommerce, создавая в нем отдельный проект и edmx. Шаблоны POCO используются для создания моего пользовательского класса ObjectContext
потомков.
Я проверил все свойства, все пространства имен и все еще получал вышеупомянутое исключение.
Суть заключается в удалении файла MyModel.Designer.cs, который сгенерировал новый класс потомства ObjectContext
(с другим именем и внутри другого пространства имен).
Ответ 6
мы имеем ту же проблему, что и без модели edmx, мы используем EF powertools beta 2 с первой функцией обратного инженерного кода для генерации наших объектов, контекста и представлений.
и у нас странное поведение, что в команде на нескольких машинах хэш для скомпилированных скомпилированных представлений отличается, а затем команда TFS создается так же, как и на других машинах, мы получаем исключение, подобное следующему. Вопрос основан на том, что силовые инструменты генерируют хэш для скомпилированных представлений? и что мы можем изменить, что он является последовательным, мы используем power tools beta 2 с EF 4.3.1, system.data.v4.0.30319, против Oracle db с использованием драйверов devart oracle.
контекст генерировать представления
//--------------------------------------------- ---------------------------------
//
//Этот код был сгенерирован инструментом.
//Версия выполнения: 4.0.30319.551
//Изменения в этом файле могут привести к неправильному поведению и будут потеряны, если код будет восстановлен.
//
//--------------------------------------------- ---------------------------------
[сборка: System.Data.Mapping.EntityViewGenerationAttribute(typeof (Edm_EntityMappingGeneratedViews.ViewsForBaseEntitySetsC6473E0A11A196A36CC5839589DE2DE553F202E361016A89F2142797168B2534))]
пространство имен Edm_EntityMappingGeneratedViews
{
/// <Summary>
/// The type contains views for EntitySets and AssociationSets that were generated at design time.
/// </Summary>
public sealed class ViewsForBaseEntitySetsC6473E0A11A196A36CC5839589DE2DE553F202E361016A89F2142797168B2534 : System.Data.Mapping.EntityViewContainer
{
/// <Summary>
/// The constructor stores the views for the extents and also the hash values generated based on the metadata and mapping closure and views.
/// </Summary>
public ViewsForBaseEntitySetsC6473E0A11A196A36CC5839589DE2DE553F202E361016A89F2142797168B2534()
{
this.EdmEntityContainerName = "Context";
this.StoreEntityContainerName = "CodeFirstDatabase";
this.HashOverMappingClosure = "2c6bbce22db7c9c65f8a70c5a1bae1225522a2124aad50e74bdc186ce8c70508";
this.HashOverAllExtentViews = "26cad9d7334571a0116f89413345d00ec8e031706228df6e653c7b6396c94591";
this.ViewCount = 56;
}
исключение:
System.Data.EntityCommandCompilationException: System.Data.EntityCommandCompilationException: Ошибка при подготовке определения команды. Подробнее см. Внутреннее исключение. --- > System.Data.MappingException: информация о сопоставлении и метаданных для EntityContainer 'Context' больше не соответствует информации, используемой для создания предварительно сгенерированных представлений.
Ответ 7
У меня была аналогичная проблема при интеграции различных проектов.
Проблема заключалась в том, что у меня было более одного edmx
, так как у меня было много проектов.
Строка подключения была одинаковой, но пространство имен было иным.
Чтобы решить эту проблему, выберите одно из соединений для использования и изменения других.
Имейте в виду, что вам нужно будет внести изменения в конструктор .cs, а также в xml файл.
Ответ 8
Была аналогичная проблема после изменения вида sql. Имеет правую мышь в файле tt для ее обновления и исправления.