Ключевое слово не поддерживается: метаданные
Эта строка:
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="data source=***********;initial catalog=********;persist security info=True;user id=*********;password=********;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.SqlClient" /></connectionStrings>
Не знаю, где именно это происходит.
Ответы
Ответ 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="
data source=myserver;
initial catalog=mydatabase;
Persist Security Info=True;
User ID=myusername;
Password=mypassword;
MultipleActiveResultSets=True;
application name=EntityFramework
"
Большинство людей, которые сталкиваются с этой проблемой, похоже, вырезали строку подключения 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="
metadata=res://*/XxDbContext.csdl|
res://*/XxDbContext.ssdl|
res://*/XxDbContext.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 попытался использовать ее для подключения к базе данных, она сгенерировала эту ошибку.
Другими словами, когда вы вставляете строки подключения в диалоги публикации, вам нужно вставить строку соединения 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", Пользовательский работает хорошо.
![введите описание изображения здесь]()