MetadataException: невозможно загрузить указанный ресурс метаданных

Этот вопрос связан с этим: Проблемы с расположением матриц в php

Представленные ответы, похоже, работают, но их сложно понять. Очень простой способ решить это - деление и завоевание, то есть, прочитав край, удалите его, и следующее чтение будет намного проще. Посмотрите полное решение на PHP ниже:

#The source number matrix
$source[0] = array(1, 2, 3, 4);
$source[1] = array(5, 6, 7, 8);
$source[2] = array(9, 10, 11, 12);
$source[3] = array(13, 14, 15, 16);
$source[4] = array(17, 18, 19, 20);

#Get the spiralled numbers
$final_spiral_list = get_spiral_form($source);
print_r($final_spiral_list);


function get_spiral_form($matrix)
{
    #Array to hold the final number list
    $spiralList = array();

    $result = $matrix;
    while(count($result) > 0)
    {
        $resultsFromRead = get_next_number_circle($result, $spiralList);
        $result = $resultsFromRead['new_source'];
        $spiralList = $resultsFromRead['read_list'];
    }

    return $spiralList;
}


function get_next_number_circle($matrix, $read)
{
    $unreadMatrix = $matrix;

    $rowNumber = count($matrix);
    $colNumber = count($matrix[0]);

    #Check if the array has one row or column
    if($rowNumber == 1) $read = array_merge($read, $matrix[0]);
    if($colNumber == 1) for($i=0; $i<$rowNumber; $i++) array_push($read, $matrix[$i][0]);
    #Check if array has 2 rows or columns
    if($rowNumber == 2 || ($rowNumber == 2 && $colNumber == 2)) 
    {
        $read = array_merge($read, $matrix[0], array_reverse($matrix[1]));
    }

    if($colNumber == 2 && $rowNumber != 2) 
    {
        #First read left to right for the first row
        $read = array_merge($read, $matrix[0]);
        #Then read down on right column
        for($i=1; $i<$rowNumber; $i++) array_push($read, $matrix[$i][1]);
        #..and up on left column
        for($i=($rowNumber-1); $i>0; $i--) array_push($read, $matrix[$i][0]);
    }



    #If more than 2 rows or columns, pick up all the edge values by spiraling around the matrix
    if($rowNumber > 2 && $colNumber > 2)
    {
        #Move left to right
        for($i=0; $i<$colNumber; $i++) array_push($read, $matrix[0][$i]);
        #Move top to bottom
        for($i=1; $i<$rowNumber; $i++) array_push($read, $matrix[$i][$colNumber-1]);
        #Move right to left
        for($i=($colNumber-2); $i>-1; $i--) array_push($read, $matrix[$rowNumber-1][$i]);
        #Move bottom to top
        for($i=($rowNumber-2); $i>0; $i--) array_push($read, $matrix[$i][0]);
    }

    #Now remove these edge read values to create a new reduced matrix for the next read
    $unreadMatrix = remove_top_row($unreadMatrix);  

    $unreadMatrix = remove_right_column($unreadMatrix); 
    $unreadMatrix = remove_bottom_row($unreadMatrix);   
    $unreadMatrix = remove_left_column($unreadMatrix);  

    return array('new_source'=>$unreadMatrix, 'read_list'=>$read);
}


function remove_top_row($matrix)
{
    $removedRow = array_shift($matrix);
    return $matrix;
}

function remove_right_column($matrix)
{
    $neededCols = count($matrix[0]) - 1;
    $finalMatrix = array();
    for($i=0; $i

655
задан J. Steen 17 February 2013 в 08:50
поделиться

18 ответов

Это означает, что приложение не может загрузить EDMX. Существует несколько вещей, которые могут вызвать это.

  • Вы, возможно, изменили свойство MetadataArtifactProcessing модели для Копирования для Вывода Каталога.
  • Строка подключения могла быть неправильной. Я знаю, что Вы говорите, что не изменили его, но если Вы изменились, другие вещи (скажите, название блока), это могло все еще быть неправильно.
  • Вы могли бы использовать задачу посткомпиляции встроить EDMX в блок, который больше не работает по некоторым причинам.

Короче говоря, нет действительно достаточного количества детали в Вашем вопросе дать точный ответ, но надо надеяться эти идеи должны получить Вас на правильном пути.

Обновление: я записал сообщение в блоге с большим количеством полных шагов для поиска и устранения неисправностей.

834
ответ дан 22 November 2019 в 21:47
поделиться

Я просто не ссылался на свою библиотеку классов, которая содержала файл EDMX.

1
ответ дан PeterX 17 February 2013 в 08:50
поделиться

Если вы используете edmx из другого проекта, то в строке подключения измените ...

metadata=res://*/Data.DataModel.csdl

... до ...

metadata=res://*/DataModel.csdl
2
ответ дан Graham Laight 17 February 2013 в 08:50
поделиться

Я только что провел 30 минут с этим. Я переименовал объект entity, переименовал запись в файле конфигурации, но есть еще кое-что ... вы также должны изменить ссылку на csdl

, которую очень легко пропустить - если вы переименовываете, убедитесь, что вы получите все ....

8
ответ дан TobyEvans 17 February 2013 в 08:50
поделиться

В моем случае это решается изменением свойств файла edmx.

  1. Откройте файл edmx
  2. Щелкните правой кнопкой мыши в любом месте дизайнера EDMX
  3. выберите свойства
  4. обновите свойство, называемое «Обработка артефактов метаданных», до «Встроить». в выходной сборке "

это решило проблему для меня. Проблема в том, что когда контейнер пытается найти метаданные, он не может его найти. так просто сделайте это в той же сборке. это решение не будет работать, если у вас есть файлы edmx в другой сборке

6
ответ дан ben 17 February 2013 в 08:50
поделиться

Мне удалось решить эту проблему в Visual Studio 2010, VB.net (ASP.NET) 4.0.

Во время работы мастера модели сущностей вы сможете увидеть строку подключения сущности. Оттуда вы можете скопировать и вставить в строку подключения.

Единственное, чего мне не хватало, это «App_Code». в строке соединений.

entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"
5
ответ дан Adnan 17 February 2013 в 08:50
поделиться

У меня была та же проблема 27 сентября 2019.

Мой API находится в Предназначении ядра сети Dot к платформе .NET. edmx находится в другой библиотеке классов, которая находится в платформе .NET только.

я заметил это, когда я пытаюсь назвать это edmx от API.. по некоторым причинам я получил ту ошибку.

то, Что я сделал, перейдите к obj папке API и удалите все. тогда уберите проект API и попробуйте еще раз, и это работало на меня.

0
ответ дан Amol Aher 4 November 2019 в 07:23
поделиться

The ultimate solution (even after recreating the database on two other machines, as well as the EDMX and other sundries) was to not use the first edition of Entity Framework. Looking forward to evaluating it again in .NET 4.0.

After running into the same problem again and searching all over for an answer, I finally found someone who'd had the same problem. It appears that the connection string wasn't correctly generated by Visual Studio's wizard, and the link to the metadata resources was missing an important path.

v1.0 BUG?: Unable to load the specified metadata resource. Scripts != Models

Update 2013-01-16: Having transitioned to almost exclusively using EF Code First practices (even with existing databases) this problem is no longer an issue. For me, that was a viable solution to reducing the clutter from auto-generated code and configuration and increasing my own control over the product.

4
ответ дан 22 November 2019 в 21:47
поделиться

Это небольшое изменение помогает решить эту проблему.

У меня есть решение с проектом 3.

connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;

изменить на

connectionString="metadata=res://*/;
352
ответ дан 22 November 2019 в 21:47
поделиться

У меня была такая же проблема. Я заглянул в свою соблюдаемую dll с рефлектором и увидел, что имя ресурса неправильное. Я переименовал, и сейчас все в порядке.

6
ответ дан 22 November 2019 в 21:47
поделиться

У меня была аналогичная ошибка. Я воссоздал проект (длинная история) и вытащил все из старого проекта. Я не осознавал, что моя модель раньше находилась в каталоге под названием «Модель», а теперь находилась в каталоге под названием «Модели». Однажды я изменил соединение в моем Web.Config с этого:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl 

на это:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl

Все работало (изменил Model на Models ). Обратите внимание, что мне пришлось изменить эти три места в этой строке.

63
ответ дан 22 November 2019 в 21:47
поделиться

Это случилось со мной, когда я случайно переключил действие сборки файла edmx (отображается в разделе «Свойства» в среде IDE) с «EntityDeploy» на «Нет». EntityDeploy - это то, что заполняет метаданные: см. http://msdn.microsoft.com/en-us/library/cc982037.aspx

12
ответ дан 22 November 2019 в 21:47
поделиться

У меня была такая же проблема и решение, как у Рика, за исключением того, что я импортировал существующий .edmx в новый проект, и хотя базовое пространство имен не имело значения, он был импортирован в другой подкаталог, поэтому мне также пришлось обновить строку подключения в Web.Config в трех местах, чтобы включить различное именование подкаталога:

1
ответ дан 22 November 2019 в 21:47
поделиться

Моя теория заключается в том, что если у вас есть несколько файлов edmx с одинаковым именем (например, Model1), это исключение будет. У меня возникла такая же проблема, когда я решил назвать все мои файлы edmx (находящиеся в разных проектах) как Model1, потому что я думал, что они должны быть независимыми.

0
ответ дан 22 November 2019 в 21:47
поделиться

Вы можете получить это исключение, когда Edmx находится в одном проекте, а вы используете его из другого.

Причина в том, что Res://*/ - это uri, который указывает на ресурсы в КУРРЕНТНОЙ сборке. Если Edm определен в сборке, отличной от использующего его кода, res://*/ не будет работать, потому что ресурс не может быть найден.

Вместо указания '*' нужно указать полное имя сборки (включая токен открытого ключа). Например:

res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...

Для построения строк подключения лучше использовать EntityConnectionStringBuilder:

public static string GetSqlCeConnectionString(string fileName)
{
    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlServerCe.3.5";
    csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName);

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName);

    return csBuilder.ToString();
}

public static string GetSqlConnectionString(string serverName, string databaseName)
{
    SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder();

    providerCs.DataSource = serverName;
    providerCs.InitialCatalog = databaseName;
    providerCs.IntegratedSecurity = true;

    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlClient";
    csBuilder.ProviderConnectionString = providerCs.ToString();

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
        typeof(YourObjectContextType).Assembly.FullName);

    return csBuilder.ToString();
}

Если вы все еще сталкиваетесь с исключением, откройте сборку в reflector и проверьте имена файлов .csdl, .ssdl и .msl. Если имена ресурсов отличаются от имен, указанных в значении метаданных, сборка не будет работать.

115
ответ дан 22 November 2019 в 21:47
поделиться

В моем случае эта проблема была связана с переименованием файла edmx моей модели ... исправление строки подключения app.config для файлов csdl / ssdl / msl устранило мою проблему.

Если вы используете конструктор EF 4.0 для генерации вашего csdl / ssdl / msl, эти 3 «файла» фактически будут храниться в основном файле edmx модели. В этом случае сообщение Вакаса в значительной степени уместно. Важно понимать, что «Model_Name» в его примере нужно будет изменить на любое текущее имя файла .edmx вашей модели (без .edmx).

Кроме того, если ваш файл edmx не находится на корневом уровне вашего проекта, вам необходимо указать имя_модели в начале относительного пути, например

res://*/MyModel.WidgetModel.csdl|res://*/MyModel.WidgetModel.ssdl|res://*/MyModel.WidgetModel.msl

указывает, что csdl / ssdl / msl xml хранится в файле модели «WidgetModel.edmx», который хранится в папке с именем «MyModel».

3
ответ дан 22 November 2019 в 21:47
поделиться

Я написал этот вспомогательный класс для создания экземпляров объектов ObjectContext, когда они определены в другом проекте, нежели проект, использующий его. Я анализирую строку подключения в файле конфигурации и заменяю '*' на полное имя сборки.

Он не идеален, потому что он использует отражение для построения объекта, но это самый общий способ сделать это, который я смог найти.

Надеюсь, это кому-то поможет.

public static class EntityHelper<T> where T : ObjectContext
{
    public static T CreateInstance()
    {
        // get the connection string from config file
        string connectionString = ConfigurationManager.ConnectionStrings[typeof(T).Name].ConnectionString;

        // parse the connection string
        var csBuilder = new EntityConnectionStringBuilder(connectionString);

        // replace * by the full name of the containing assembly
        csBuilder.Metadata = csBuilder.Metadata.Replace(
            "res://*/",
            string.Format("res://{0}/", typeof(T).Assembly.FullName));

        // return the object
        return Activator.CreateInstance(typeof(T), csBuilder.ToString()) as T;
    }
}
3
ответ дан 22 November 2019 в 21:47
поделиться

Для всех вас, SelftrackingEntities Пользователи, если вы следовали инструкциям Microsoft Walk-through и разделили класс контекста объекта на проект службы wcf (путем ссылки на контекст .tt), поэтому этот ответ предназначен для вас:

часть ответов, представленных в этом сообщении, которая включает такой код, как:

... = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName); 

НЕ БУДЕТ РАБОТАТЬ ДЛЯ ВАС !! причина в том, что YourObjectContextType.Assembly теперь находится в другом Assembley (внутри сборки проекта wcf),

Поэтому вам следует заменить YourObjectContextType.Assembly.FullName на ->

ClassTypeThatResidesInEdmProject.Assembly.FullName 

получайте удовольствие.

3
ответ дан 22 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: