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

Ключевое слово не поддерживается: метаданные

Эта строка:

WebSecurity.InitializeDatabaseConnection(connectionStringName: "DefaultConnection", userTableName: "UserProfile", userIdColumn: "UserID", userNameColumn: "UserName", autoCreateTables: true);

Выбрасывает:

'System.ArgumentException' произошел в System.Data.dll, но не был обработан в коде пользователя

Дополнительная информация: Ключевое слово не поддерживается: "метаданные".

Моя строка подключения:

add name="DefaultConnection" connectionString="metadata=res://*/TalyllynModel.csdl|res://*/TalyllynModel.ssdl|res://*/TalyllynModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=***********;initial catalog=********;persist security info=True;user id=*********;password=********;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.SqlClient" /></connectionStrings>

Не знаю, где именно это происходит.

4b9b3361

Ответ 1

Строка, которую вы передали, не является допустимой строкой подключения к базе данных, это строка подключения EF, которая содержит строку подключения SQL Server в ее provider connection string. WebSecurity.InitializeDatabaseConnection ожидает действительную строку подключения к базе данных

Чтобы избежать синтаксического разбора строки подключения, вы можете использовать класс EntityConnectionStringBuilder для синтаксического анализа строки и получения строки подключения к базе данных из ее ProviderConnectionString свойство

Ответ 2

Когда это случилось со мной, это произошло потому, что строка подключения имела:

providerName="System.Data.SqlClient"

но это должно быть:

providerName="System.Data.EntityClient"

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

Ответ 3

Просто добавьте еще одну возможность (с которой я столкнулся) - что может быть, если вы разрабатываете/поддерживаете Azure WebApp, используя строку подключения, сохраненную в настройках Azure Application.

Помимо каждой строки подключения в настройках приложения это выпадающий список для типа строки подключения - очень легко забыть установить это значение "Пользовательский" для значений платформы Entity Framework и оставить его по умолчанию (база данных SQL), что также вызывает ошибка выше.

Ответ 4

Привет,

По-моему, строка подключения для ADO.NET(в этом caseSqlConnection) не могут использовать метаданные. Вы используете один конкретный для платформы Entity Framework. ADO.NET должно быть что-то вроде:

"data source=KAPS-PC\KAPSSERVER;initial catalog=vibrant;integrated security=True"

Итак, чтобы подвести итог, вам нужны две отдельные строки подключения: одна для EF и один для ADO.NET.

Souce: http://forums.iis.net/post/2097280.aspx

Ответ 5

Я собираюсь выкинуть еще один ответ, на всякий случай, если кто-то еще столкнется с этим через тот же странный сценарий, что и я.

Для начала, как говорили другие, строки соединения ADO и строки соединения EF различны.

Строка соединения ADO содержит несколько разделенных точкой с запятой полей, которые могут очень сильно отличаться от одного типа подключения к другому, но обычно вы видите "источник данных = xxx", "начальный каталог = yyy" и т.д. Вы не увидите "метаданные = ZZZ".

Строка соединения EF имеет одинаковую структуру, но в ней есть "metadata = zzz" и "connection connection string = www", где "www" - это экранированная строка соединения ADO.

Таким образом, нормальный формат для строки соединения ADO:

data source=myserver;
initial catalog=mydatabase;
Persist Security Info=True;
User ID=myusername;
Password=mypassword;
MultipleActiveResultSets=True

В то время как нормальный формат для строки подключения EF:

metadata=res://*/MyDbContext.csdl|
    res://*/MyDbContext.ssdl|
    res://*/MyDbContext.msl;
provider=System.Data.SqlClient;
provider connection string=&quot;
    data source=myserver;
    initial catalog=mydatabase;
    Persist Security Info=True;
    User ID=myusername;
    Password=mypassword;
    MultipleActiveResultSets=True;
    application name=EntityFramework
    &quot;

Большинство людей, которые сталкиваются с этой проблемой, похоже, вырезали строку подключения EF и вставляли ее в место, где требовалась строка соединения ADO. В сущности, я сделал то же самое, но процесс был не таким ясным, как все это.

В моем случае у меня было веб-приложение, использующее EF, поэтому его web.config правильно содержал строки подключения EF.

Я опубликовал пакет развертывания, и процесс предложит вам строки подключения, которые будут использоваться при развертывании. Они хранятся в созданном пакете SetParameters.xml пакета развертывания.

Я вырезал и вставлял строки подключения EF в поля ввода диалогового окна публикации.

Я развернул веб-приложение, попытался получить к нему доступ и получил ошибку "Ключевое слово без поддержки: метаданные".

То, что я не понял, заключается в том, что MS publish tool ожидает строку подключения ADO, и, учитывая, что она построит строку подключения EF.

В результате у SetParameters.xml и моего развернутого web.config были строки подключения, которые выглядели следующим образом:

metadata=res://*/MyDbContext.csdl|
    res://*/MyDbContext.ssdl|
    res://*/MyDbContext.msl;
provider=System.Data.SqlClient;
provider connection string=&quot;
    metadata=res://*/XxDbContext.csdl|
        res://*/XxDbContext.ssdl|
        res://*/XxDbContext.msl;
    provider=System.Data.SqlClient;
    provider connection string=&amp;quot;
        data source=myserver;
        initial catalog=mydatabase;
        Persist Security Info=True;
        User ID=myusername;
        Password=mypassword;
        MultipleActiveResultSets=True;
        application name=EntityFramework
        &amp;quot;
    &quot;"

Другими словами, строка подключения встроенного поставщика была строкой соединения EF, а не строкой соединения ADO, поэтому, когда EF попытался использовать ее для подключения к базе данных, она сгенерировала эту ошибку.

Другими словами, когда вы вставляете строки подключения в диалоги публикации, вам нужно вставить строку соединения ADO, а не строку соединения EF, даже если то, что вы имеете в файле web.config, который вы копируете, является EF.

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

Ответ 6

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

Обратите внимание, как он проверяет, является ли это строкой соединения Entity Framework, и если да, то она извлекает часть "строки подключения поставщика", которая затем может быть передана в SqlConnectionStringBuilder:

Если бы я этого не сделал, я получил бы эту неприятную ошибку "Keyword Not Supported: Metadata".

if (connectionString.ToLower().StartsWith("metadata="))
{
    System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder efBuilder = new System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder(connectionString);
    connectionString = efBuilder.ProviderConnectionString;
}

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString);
DatabaseServer = builder.DataSource;             //  eg "MikesServer"
DatabaseName = builder.InitialCatalog;           //  eg "Northwind"

Ответ 7

У меня была такая же ошибка, когда я позволил поверить, что я включаю ASP.NET Identity 2. Они не то же самое! Включена старая версия управления идентификацией, которая использует другую структуру таблиц для ASP.NET Identity 2 (которая не требует "включения", кстати, именно там).

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

<roleManager
      enabled="true"
      cacheRolesInCookie="true"
      defaultProvider="OurSqlRoleProvider"
     >
      <providers>
          <add
             connectionStringName="DefaultConnection"
             applicationName="/"
             name="OurSqlRoleProvider"
             type="System.Web.Security.SqlRoleProvider" />
      </providers>

  </roleManager>

Ответ 8

Для Azure Web App тип строки подключения не имеет "System.Data.EntityClient", Пользовательский работает хорошо.

введите описание изображения здесь