Подтвердить что ты не робот

"Информация метаданных не найдена" при использовании шаблона 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);

Любые идеи о том, что может быть неправильным?

4b9b3361

Ответ 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 для ее обновления и исправления.