palabra initialcatalog ejemplo clave admitida c# sql-server asp.net-mvc entity-framework

c# - initialcatalog - Palabra clave no admitida: metadatos



connection string sql server ejemplo (9)

Esta línea:

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

Está lanzando:

''System.ArgumentException'' se produjo en System.Data.dll pero no se manejó en el código de usuario

Información adicional: Palabra clave no admitida: ''metadata''.

Mi cadena de conexión es:

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>

No estoy seguro de dónde va mal.


Hola,

En mi opinión, la cadena de conexión para ADO.NET (en este caso SqlConnection) no puede usar ''metadatos''. Está utilizando el específico para Entity Framework. El ADO.NET debería ser algo así como:

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

Entonces, para resumir, necesita dos cadenas de conexión separadas, una para EF y otra para ADO.NET.

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


Aquí hay un código que uso para extraer el nombre de la base de datos y el nombre del servidor de una cadena de conexión.

Observe cómo comprueba si se trata de una cadena de conexión de Entity Framework, y si es así, extrae la parte de "cadena de conexión del proveedor", que luego se puede pasar a SqlConnectionStringBuilder :

Si no hiciera esto, obtendría el desagradable error " 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"


Comprobar en este lugar

<add name="ConnectionString" connectionString="Data Source=SMITH;Initial Catalog=db_ISMT;Persist Security Info=True;User ID=sa;Password=@darksoul45;MultipleActiveResultSets=True;Application Name=EntityFramework" providerName="System.Data.SqlClient" />

Como puede ver, hay dos cadenas de conexión, una para ADO y otra para el Sistema de inicio de sesión o lo que usted desee. En mi caso, ConnectionString es para el sistema de inicio de sesión, así que lo he usado en: -

SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); SqlCommand cmd = null; SqlDataReader dr = null; protected void Page_Load(object sender, EventArgs e)


Cuando esto me sucedió fue porque la cadena de conexión tenía:

providerName="System.Data.SqlClient"

pero debería ser:

providerName="System.Data.EntityClient"

porque como dijo la otra respuesta, es una cadena de conexión EF.


La cadena que pasó no es una cadena de conexión de base de datos válida, es una cadena de conexión EF que contiene una cadena de conexión de SQL Server en su parámetro de provider connection string . WebSecurity.InitializeDatabaseConnection espera una cadena de conexión de base de datos válida

Para evitar analizar la cadena de conexión usted mismo, puede usar la clase EntityConnectionStringBuilder para analizar la cadena y recuperar la cadena de conexión de la base de datos de su propiedad ProviderConnectionString


Para Azure Web App, el tipo de cadena de conexión no tiene "System.Data.EntityClient" , Custom funciona bien.


Solo para agregar otra posibilidad (que encontré), que podría ser el caso si está desarrollando / manteniendo una aplicación web de Azure, utilizando una cadena de conexión guardada en la configuración de la aplicación de Azure.

Al lado de cada cadena de conexión en la Configuración de la aplicación hay un menú desplegable para el tipo de cadena de conexión; es muy fácil olvidarse de configurar esto en ''Personalizado'' para los valores de Entity Framework y dejarlo en el valor predeterminado (Base de datos SQL), que también causa el error anterior .


Una publicación anterior pero mi solución,

Desafortunadamente, esto no me lo resolvió al usar Azure Functions hablando con un proyecto separado (biblioteca de clases) con un EDMX.

Tuve que editar el constructor de la clase Context.CS reemplazando el

: base ("Entities")

con

: base (ConfigurationManager.ConnectionStrings["Entities"].ConnectionString)

Con suerte, esto podría ayudar a alguien más en necesidad.


Voy a arrojar otra respuesta, en caso de que alguien más se encuentre con esto en el mismo escenario extraño que yo.

Para empezar, como han dicho otros, las cadenas de conexión ADO y las cadenas de conexión EF son diferentes.

Una cadena de conexión ADO contiene una cantidad de campos separados por punto y coma, que pueden variar de un tipo de conexión a otro, pero normalmente se ve "origen de datos = xxx", "catálogo inicial = yyy", etc. No verá "metadatos = zzz ".

Una cadena de conexión EF tiene la misma estructura, pero tiene un "metadata = zzz" y una "cadena de conexión del proveedor = www", donde "www" es una cadena de conexión ADO escapada.

Entonces, un formato normal para una cadena de conexión ADO es:

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

Mientras que un formato normal para una cadena de conexión EF es:

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;

La mayoría de las personas que se encuentran con este problema parecen haber cortado una cadena de conexión EF y pegarla en un lugar que necesitaba una cadena de conexión ADO. En esencia, hice lo mismo, pero el proceso no fue tan claro como todo eso.

En mi caso, tenía una aplicación web que utilizaba EF, por lo que su web.config contenía adecuadamente las cadenas de conexión EF.

Publiqué un paquete de implementación y el proceso le solicita las cadenas de conexión que se utilizarán al implementar. Estos se almacenan en el archivo SetParameters.xml generado del paquete de implementación.

Corté y pegué las cadenas de conexión EF en los campos de entrada del diálogo de publicación.

Implementé la aplicación web, intenté acceder a ella y obtuve el error "Palabra clave no compatible: metadatos".

Lo que no me di cuenta es que la herramienta de publicación de MS esperaba una cadena de conexión ADO, y que dado que construiría una cadena de conexión EF.

El resultado fue que SetParameters.xml y mi web.config implementado tenían cadenas de conexión que se veían así:

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;"

En otras palabras, la cadena de conexión del proveedor incrustado era una cadena de conexión EF y no una cadena de conexión ADO, por lo que cuando EF intentó usarlo para conectarse a la base de datos, generó este error.

En otras palabras, cuando pegue las cadenas de conexión en los diálogos de publicación, deberá pegar una cadena de conexión ADO, no una cadena de conexión EF, incluso si lo que tiene en la web.config está copiando es una cadena de conexión EF .

Puede extraer una cadena de conexión ADO del campo de cadena de conexión del proveedor de una cadena de conexión EF, y eso es lo que necesitará, si está utilizando la misma conexión en la implementación que en el desarrollo local.