Não é possível recuperar metadados

MVC4 + Entity Framework 4.4 + MySql + POCO / Code First

Estou configurando a configuração acima .. aqui estão minhas aulas:

namespace BTD.DataContext { public class BTDContext : DbContext { public BTDContext() : base("name=BTDContext") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); //modelBuilder.Conventions.Remove(); } public DbSet Products { get; set; } public DbSet 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; } } } 

Aqui está a minha configuração do web.config …

    
  1. O database e tabelas já existem …
  2. Eu ainda sou muito novo com o mvc, mas estava usando este tutorial

O aplicativo é construído bem … no entanto, quando eu tento adicionar um controlador usando o produto (BTD.Data) como minha class de modelo e BTDContext (BTD.DataContext) como minha class de contexto de dados recebo o seguinte erro:

Não é possível recuperar metadados para BTD.Data.Product usando o mesmo DbCompiledModel para criar contexto em diferentes tipos de servidores de database não é suportado. Em vez disso, crie um DbCompiledModel separado para cada tipo de servidor sendo usado.

Eu estou em uma perda completa – eu vasculhei google com quase todas as variações diferentes da mensagem de erro acima que eu posso pensar, mas sem sucesso.

Aqui estão as coisas que eu posso verificar …

  1. MySql está funcionando corretamente
  2. Estou usando o MySql Connector versão 6.5.4 e criei outros formulários da Web do asp.net + aplicativos de estrutura de entidade com problemas ZERO

Eu também tentei include / remover isso no meu web.config:

      

Eu literalmente tenho trabalhado neste bug por dias – estou no ponto agora que eu estaria disposto a pagar alguém para resolvê-lo .. sem piada … Eu realmente adoraria usar MVC 4 e Razor – I estava tão animado para começar isso, mas agora estou bastante desanimado – eu realmente aprecio qualquer ajuda / orientação sobre isso!

Observe também – eu estou usando o Entityframework da Nuget …

Outra nota

Eu estava usando o modelo de visual studio padrão que cria seu projeto MVC com as páginas da conta e outras coisas. Acabei de remover todas as referências para os arquivos adicionados porque eles estavam tentando usar o “DefaultConnection” que não existia – então eu pensei que esses arquivos podem estar causando o erro – no entanto, ainda sem sorte depois de removê-los –

Eu só queria que todos soubessem que estou usando o modelo de projeto MVC do Visual Studio, que pré-cria um monte de arquivos. Vou tentar recriar tudo isso a partir de um projeto em branco do MVC que não tem esses arquivos – vou atualizar isso uma vez eu testo que

UPDATE PARA USAR VS MVC Template Básico: Mesmo erro resultou – ainda não há solução

OUTRA PESSOA COM EXPERIÊNCIA DO MESMO PROBLEMA

Bem aqui é outra questão stackoverflow que imita o meu – no entanto eu tentei sua solução sem sucesso – talvez alguém que está tendo este mesmo problema pode se beneficiar do link

ATUALIZAR

Eu recentemente tentei colocar isso no MS Sql Server e o view scaffolding adiciona bem sem nenhum erro – então eu não tenho certeza se é o meu database MySql ou string de conexão ou o que … me deixando louca ..

Outras referências

Parece que alguém está tendo os mesmos problemas que eu estou – a única diferença é que eles estão usando o SQL Server – eu tentei tweaking todo o meu código para seguir as sugestões sobre esta pergunta stackoverflow / resposta aqui, mas ainda sem sucesso

FIXAÇÃO POSSÍVEL ???

Então, isso é estranho … depois de ligá-lo ao MS Sql Server e adicionar o controlador, em seguida, reverter a seqüência de conexão para MySql é realmente trabalhando com o MySql … o que diabos! ??

Então parece que quando você tenta adicionar seu controller e o view scaffolding (é que a frase correta?) É adicionada WITH a string de conexão mysql falha … no entanto se você conectá-lo a um db sql server, gera o scaffolding / controller, em seguida, reverter para a string de conexão mysql que funciona ….?!?!

Parece que o scaffold do controlador MVC4 não está reconhecendo corretamente a cadeia de conexão MySQL. Altere a string de conexão conforme mostrado abaixo ao gerar o código EF CRUD para os controladores:

    

Altere de volta ao padrão ao executar o aplicativo:

    

Observe a mudança, nome do provedor.

O imesh sugerindo quase resolver o meu problema, mas além disso eu temporário comentou linha

 [DbConfigurationType(typeof(MySqlEFConfiguration))] 

que estava na class DBContext. E, claro, após o controlador de criação, essa linha deve ser descomentada e retornar System.Data.SqlClient para MySql.Data.MySqlClient no arquivo de configuração.

Usando o VS 2013, o MySQL Connector / NET 6.9.6, o Entity Framework 6, o Web API 2.2 e o MySQL server 5.7, tive que combinar as respostas para evitar o erro “Unable to retrieve metadata”.

Para adicionar com êxito um controlador a um projeto .NET que usa uma conexão MySQL, faça o seguinte:

  1. Adicione temporariamente uma string de conexão com System.Data.SqlClient como o providerName e comente a do MySQL. Não importa se a string de conexão é válida.
  2. Assegure-se de que MySqlEFConfiguration não esteja ativado de alguma forma.
  3. Reconstruir.

Sobre o segundo ponto, a documentação do MySQL sobre o uso do Connector / NET com o EF6 indica três maneiras possíveis de ativar a MySqlEFConfiguration . Certifique-se de que nenhum deles esteja ativado ao adicionar controladores usando o modelo VS.

  1. Adicionando o DbConfigurationTypeAttribute na class de contexto:

[DbConfigurationType(typeof(MySqlEFConfiguration))]

  1. Chamando DbConfiguration.SetConfiguration (new MySqlEFConfiguration ()) na boot do aplicativo

  2. Defina o tipo DbConfiguration no arquivo de configuração:

Eu testei também em torno deste bug e vi um outro problema.

O código a seguir está no meu Web.config (sem, não funciona):

  

Mudou para:

  

Funciona para mim … adiciona o andaime e depois muda de volta

Eu tenho tido o mesmo problema usando o EF 4.3.1 e o MySql Connecter / Net 6.6.4.0

Isso funcionou para mim, não há necessidade de se conectar a um código diferente de db ou extra na class Context.

Adicione isto entre as tags entityFramework no seu arquivo web.config quando você quiser construir um scaffold:

      

Em seguida, comente o código acima quando quiser executar migrações e vice-versa.

Então você web.config ficará assim:

         

Isso é bastante ridículo como os desenvolvedores .NET têm que passar por algumas dificuldades árduas para que o código funcione.

Exemplo de trabalho

https://github.com/dublinan/mvc-mysql-ef-example

Links para meu projeto do github

Por favor, tente usar o

System.ComponentModel.DataAnnotations

namespace junto com o atributo [Key] nos membros da class EDM.

Isso funcionou para mim.