asp.net - net - No se pueden recuperar los metadatos
web forms c# tutorial (6)
He estado teniendo el mismo problema con EF 4.3.1 y MySql Connecter / Net 6.6.4.0
Esto funcionó para mí, sin necesidad de conectarme a un db diferente o código adicional en la clase Context.
Agregue esto entre las etiquetas entityFramework en su archivo web.config cuando quiera construir un andamio:
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<parameter value="Data Source=./SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True" />
</parameters>
</defaultConnectionFactory>
Luego comente el código anterior cuando desee ejecutar migraciones y viceversa.
Entonces tu web.config se verá así:
<entityFramework>
<contexts>
<context type="ApptManager.Models.AppointmentsManagerContext, ApptManager">
<databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[ApptManager.Models.AppointmentsManagerContext, ApptManager], [ApptManager.Migrations.Configuration, ApptManager]], EntityFramework" />
</context>
</contexts>
<!--<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<parameter value="Data Source=./SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True" />
</parameters>
</defaultConnectionFactory>-->
</entityFramework>
Esto es bastante ridículo de cómo los desarrolladores de .NET tienen que saltar a través de algunos aros arduos para que su código funcione.
Ejemplo de trabajo
https://github.com/dublinan/mvc-mysql-ef-example
Enlaces a mi proyecto github
MVC4 + Entity Framework 4.4 + MySql + POCO / Code First
Estoy configurando la configuración anterior ... aquí están mis clases:
namespace BTD.DataContext
{
public class BTDContext : DbContext
{
public BTDContext()
: base("name=BTDContext")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//modelBuilder.Conventions.Remove<System.Data.Entity.Infrastructure.IncludeMetadataConvention>();
}
public DbSet<Product> Products { get; set; }
public DbSet<ProductImage> ProductImages { get; set; }
}
}
namespace BTD.Data
{
[Table("Product")]
public class Product
{
[Key]
public long ProductId { get; set; }
[DisplayName("Manufacturer")]
public int? ManufacturerId { get; set; }
[Required]
[StringLength(150)]
public string Name { get; set; }
[Required]
[DataType(DataType.MultilineText)]
public string Description { get; set; }
[Required]
[StringLength(120)]
public string URL { get; set; }
[Required]
[StringLength(75)]
[DisplayName("Meta Title")]
public string MetaTitle { get; set; }
[DataType(DataType.MultilineText)]
[DisplayName("Meta Description")]
public string MetaDescription { get; set; }
[Required]
[StringLength(25)]
public string Status { get; set; }
[DisplayName("Create Date/Time")]
public DateTime CreateDateTime { get; set; }
[DisplayName("Edit Date/Time")]
public DateTime EditDateTime { get; set; }
}
[Table("ProductImage")]
public class ProductImage
{
[Key]
public long ProductImageId { get; set; }
public long ProductId { get; set; }
public long? ProductVariantId { get; set; }
[Required]
public byte[] Image { get; set; }
public bool PrimaryImage { get; set; }
public DateTime CreateDateTime { get; set; }
public DateTime EditDateTime { get; set; }
}
}
Aquí está mi configuración web.config ...
<connectionStrings>
<add name="BTDContext" connectionString="Server=localhost;Port=3306;Database=btd;User Id=root;Password=mypassword;" providerName="MySql.Data.MySqlClient" />
</connectionStrings>
- La base de datos Y las tablas ya existen ...
- Todavía soy bastante nuevo con mvc pero estaba usando este tutorial
La aplicación funciona bien ... sin embargo, cuando intento agregar un controlador utilizando Producto (BTD.Data) como mi clase modelo y BTDContext (BTD.DataContext) como mi clase de contexto de datos, recibo el siguiente error:
No se admite la recuperación de metadatos para BTD.Data.Product que utiliza el mismo modelo DbCompiledModel para crear un contexto para diferentes tipos de servidores de bases de datos. En su lugar, cree un DbCompiledModel separado para cada tipo de servidor que se esté utilizando.
Estoy en una pérdida total: he rastreado google con casi todas las variaciones diferentes de ese mensaje de error anterior que se me ocurre, pero en vano.
Aquí están las cosas que puedo verificar ...
- MySql está funcionando correctamente
- Estoy usando MySql Connector versión 6.5.4 y he creado otras aplicaciones de estructura de entidades + formularios web ASP.net con CERO problemas
También he intentado incluir / eliminar esto en mi web.config:
<system.data>
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient"/>
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
Literalmente, he estado trabajando en este error durante días. Ahora que estoy dispuesto a pagarle a alguien para resolverlo. No es broma. Me encantaría usar MVC 4 y Razor. Estaba tan emocionado de comenzar con esto, pero ahora estoy bastante desanimado. ¡Realmente aprecio cualquier ayuda / orientación sobre esto!
También tenga en cuenta: estoy usando Entityframework de Nuget ...
Otra nota
Estaba usando la plantilla de estudio visual predeterminada que crea su proyecto MVC con las páginas de la cuenta y otras cosas. Acabo de eliminar todas las referencias a los archivos agregados porque intentaban usar la "Conexión por defecto" que no existía, por lo que pensé que esos archivos podrían ser los que causaban el error. Sin embargo, aún así no hubo suerte después de eliminarlos.
Solo quería que todos supieran que estoy usando la plantilla de proyecto MVC de Visual Studio que crea previamente un montón de archivos. Intentaré recrear todo esto desde un proyecto MVC en blanco que no tiene esos archivos. Lo actualizaré una vez que pruebe que
ACTUALIZACIÓN PARA EL USO DE LA Plantilla básica de VS MVC: se produjo el mismo error, aún no hay solución
OTRA PERSONA EXPERIMENTANDO EL MISMO PROBLEMA
Aquí hay otra pregunta de stackoverflow que imita la mía ; sin embargo, probé su solución en vano, tal vez alguien más que tenga este mismo problema pueda beneficiarse del enlace.
ACTUALIZAR
Recientemente, solo traté de poner esto en el servidor MS Sql y el andamio de la vista agrega bien sin error, por lo que no estoy seguro de que sea mi base de datos MySql o cadena de conexión o qué ... me está volviendo loco ...
Otras referencias
Parece que otra persona está teniendo los mismos problemas que yo, la única diferencia es que están utilizando el servidor SQL. Intenté ajustar todo mi código para seguir las sugerencias de esta pregunta / respuesta de stackoverflow aquí, pero aún no he podido hacer nada.
POSIBLE ARREGLO ???
Así que esto es raro ... después de conectarlo al servidor MS Sql y agregar el controlador, luego revertir la cadena de conexión a MySql, en realidad está FUNCIONANDO con MySql ... ¡¿qué diablos?
Así que parece que cuando intentas agregar tu controlador y la vista (¿es la frase correcta?) Se agrega CON la cadena de conexión mysql, falla ... sin embargo, si la conectas a una base de datos del servidor SQL, genera el andamio. / controller, luego vuelve a la cadena de conexión mysql funciona ...?!?!
La sugerencia de Imesh casi resuelve mi problema, pero, además, he comentado temporalmente la línea
[DbConfigurationType(typeof(MySqlEFConfiguration))]
que estaba en la clase DBContext. Y, por supuesto, después de la creación del controlador, esta línea debe estar sin comentarios y cambiar de nuevo System.Data.SqlClient a MySql.Data.MySqlClient en el archivo de configuración.
Parece que el andamio del controlador MVC4 no reconoce correctamente la cadena de conexión de MySql. Cambie la cadena de conexión como se muestra a continuación cuando genere el código EF CRUD para los Controladores:
<connectionStrings>
<add name="BTDContext" connectionString="Data Source=host_name;Database=database_name;uid=user_id;pwd=password;" providerName="System.Data.SqlClient" />
</connectionStrings>
Vuelva a cambiarlo a estándar al ejecutar la aplicación:
<connectionStrings>
<add name="BTDContext" connectionString="Data Source=host_name;Database=database_name;uid=user_id;pwd=password;" providerName="MySql.Data.MySqlClient" />
</connectionStrings>
Tenga en cuenta el cambio, nombre del proveedor.
Por favor intente usar el
System.ComponentModel.DataAnnotations
espacio de nombres junto con el atributo [Clave] en los miembros de la clase EDM.
Funciono para mi
Probé también alrededor de este error y vi otro problema.
El siguiente código está en mi Web.config (sin, no funciona):
<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
Se cambió a
<entityFramework>
Funciona para mí ... agrega el andamio y luego vuelve a cambiarlo
Usando VS 2013, MySQL Connector / NET 6.9.6, Entity Framework 6, Web API 2.2 y MySQL Server 5.7 tuve que combinar las respuestas para evitar el error sobre "No se pueden recuperar los metadatos".
Para agregar con éxito un controlador a un proyecto .NET que usa una conexión MySQL, haga lo siguiente:
- Agregue temporalmente una cadena de conexión con
System.Data.SqlClient
comoproviderName
y comente la de MySQL. No importa si la cadena de conexión es válida. - Asegúrese de que
MySqlEFConfiguration
no esté habilitado de ninguna manera. - Reconstruir.
Sobre el segundo punto, la documentación de MySQL sobre el uso de Connector / NET con EF6 establece tres formas posibles de habilitar la MySqlEFConfiguration
. Asegúrese de que ninguno de estos esté habilitado al agregar controladores usando la plantilla VS.
- Agregando el DbConfigurationTypeAttribute en la clase de contexto:
[DbConfigurationType(typeof(MySqlEFConfiguration))]
Llamando DbConfiguration.SetConfiguration (new MySqlEFConfiguration ()) al inicio de la aplicación
Establezca el tipo DbConfiguration en el archivo de configuración:
<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">