none
Erro com referência no EntityFramework ao dividir em camadas a aplicação RRS feed

  • Pergunta

  • Pessoal, comecei a dividir em camadas uma aplicação que desenvolvi utilizando EntityFramework 6.1.3 com Code First, durante este processo o Visual Studio 2013 começou a apresentar algumas mensagens estranhas como a seguinte:

    The type 'System.Data.Entity.DbContext' is defined in an assembly that is not referenced. You must add a reference to assembly 'EntityFramework, Version=4.1.0.0, Culture=neutral

    Fiz algumas pesquisas e encontrei este artigo:

    http://www.howtosolutions.net/2012/08/solving-compiler-error-cs0012-system-data-entity-dbcontext-using-entity-framework/#.VU4o1PlVhBc

    Resolvi fazer uma cópia de segurança do projeto e seguir o artigo voltando o EntityFramework para a versão 4.1 mesmo sabendo que minha aplicação nunca utilizou esta versão para ver o resultado e obtive o seguinte resultado:

    Install-Package : Unable to find version '4.1.0.0' of package 'Entityframework'.
    At line:1 char:1
    + Install-Package Entityframework -Version 4.1.0.0
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [Install-Package], InvalidOperationException
        + FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PowerShell.Commands.InstallPackageCommand

    Sempre utilizei ADO.NET por ser uma biblioteca que não apresenta comportamentos estranhos e inesperados como o Entityframework. Porém, mas uma vez estou com este problema.

    Também durante o processo foi pedido para instalar o pacote EF Code First e alguns problemas foram resolvidos, mas me restou este que ainda não consegui solucionar.

    Alguém sabe o porquê desse problema?

    sábado, 9 de maio de 2015 16:13

Respostas

  • Você tem que instalar o EF em todas as camadas. Não sei se há a possibilidade de não instalar ela na camada UI. O erro está acontecendo, justamente porque você não adicionou o EF nela.
    Se você está trabalhando com uma camada de Repositório, você não precisa acessar o dbcontext da UI.
    • Marcado como Resposta LWMN segunda-feira, 18 de maio de 2015 14:28
    quinta-feira, 14 de maio de 2015 18:16

Todas as Respostas

  • Em quais projetos aconteceu este problema? De antemão, considero que vc deva adicionar referências para o Entity Framework na sua camada de dados e também na camada de apresentação.

    Utilizar uma versão anterior do Entity Framework não faz sentido. Já utilizei o Code First em projetos multicamadas, sendo que a sugestão que lhe passei fez com que a aplicação funcionasse corretamente.

    Espero ter ajudado.

    Abs

    • Sugerido como Resposta Renato GroffeMVP segunda-feira, 11 de maio de 2015 16:42
    segunda-feira, 11 de maio de 2015 11:19
  • Em quais projetos aconteceu este problema? De antemão, considero que vc deva adicionar referências para o Entity Framework na sua camada de dados e também na camada de apresentação.

    Utilizar uma versão anterior do Entity Framework não faz sentido. Já utilizei o Code First em projetos multicamadas, sendo que a sugestão que lhe passei fez com que a aplicação funcionasse corretamente.

    Espero ter ajudado.

    Abs

    Bom dia Renato, o projeto já estava funcionando e o Entity Framework já estava instalado, isso aconteceu após as divisões em camadas, testei instalando o Entity em todas as camadas para ver se esqueci de algo, mas o problema perciste. Pesquisando em alguns sites no google, vi algumas pessoas com o mesmo problema, porém, são posts antigos e que realmente voltando a versão para 4.1 resolveria. O meu projeto foi feito com o Framework 6.

    Assim que encontrar uma solução eu posto como resolvi no forum para ajudar outras pessoas que passarem pelo mesmo problema.

    segunda-feira, 11 de maio de 2015 16:09
  • Você já tentou atualizar o EF via nuget?
    segunda-feira, 11 de maio de 2015 16:32
  • O que o Alexandre comentou seria a melhor alternativa. O NuGet normalmente baixa junto com um pacote outras referências das quais este último depende.

    Acredito que desta maneira resolva seu problema.

    segunda-feira, 11 de maio de 2015 16:38
  • Você já tentou atualizar o EF via nuget?

    Oi Alexandre, sim, eu sempre utilizo o Nuget para atualizar o EF. Eu até postei acima o erro que ele deu quando fui seguir um post para tentar fazer o que a mensagem de erro estava orientando a fazer. Dá uma lida no início da conversa acima.

    Pesquisando em sites internacionais eu vi várias pessoas com o mesmo problema, o interessante de pegar esse tipo de problema é que pode até tirar alguns amigos de apuros quando passar por isso.

    segunda-feira, 11 de maio de 2015 16:50
  • Tente recriar os projetos, copiando depois os arquivos de código-fonte para os mesmos. Pode ser que numa dessas alguma referência ficou bagunçada, sendo que este processo resolveria eventuais erros.
    segunda-feira, 11 de maio de 2015 16:52
  • O que o Alexandre comentou seria a melhor alternativa. O NuGet normalmente baixa junto com um pacote outras referências das quais este último depende.

    Acredito que desta maneira resolva seu problema.

    Sim Renato, concordo, eu sempre utilizo ele como mensionei acima. O projeto estava funcionando, só deu esse erro na divisão. Até a classe DbContext fica na cor verde como se tivesse tudo Ok quando reinstalo o Entity da versão atual que estou usando, mas ao compilar o erro mensionado no início do post é apresentado.
    segunda-feira, 11 de maio de 2015 16:56
  • Tente recriar os projetos, copiando depois os arquivos de código-fonte para os mesmos. Pode ser que numa dessas alguma referência ficou bagunçada, sendo que este processo resolveria eventuais erros.
    Por enquanto eu estou criando as camadas em uma cópia do projeto, não comecei no projeto direto para evitar problemas, vou refazer tudo para ver se apresenta o mesmo erro.
    segunda-feira, 11 de maio de 2015 17:00
  • Tente recriar os projetos, copiando depois os arquivos de código-fonte para os mesmos. Pode ser que numa dessas alguma referência ficou bagunçada, sendo que este processo resolveria eventuais erros.

    Por enquanto eu estou criando as camadas em uma cópia do projeto, não comecei no projeto direto para evitar problemas, vou refazer tudo para ver se apresenta o mesmo erro.

    Boa tarde pessoal,

    Estou tentando novamente dividir o meu projeto que foi desenvolvido usando Entity, antes de dividir em camadas ele foi testado e está rodando. Novamente inseri três projetos dentro da minha solução MvcCadastro.Aplicacao, MvcCadastro.Dominio e MvcCadastro.Repositorio. Sempre sigo este padrão para ADO.NET e funciona perfeitamente, no entity não está funcionando.

    Estou analisando camada por camada para identificar o erro. Na minha camada repositório estou com o seguinte problema:

    The type or namespace name 'DbContext' could not be found (are you missing a using directive or an assembly reference?)

    Pesquisei em alguns sites e o que eles orientam são os mesmos procedimentos que eu realizei, instalar o Entity Framework no meu projeto, que já foi instalado e em seguida fazer a referência, também ja foi feito. Normalmente quando clicamos na classe com o botão direito do mouse o Visual Studio dá a opção Resolve, mas mesmo fazendo a referência após a instalação ele não reconheceu e essa opção Resolve não apareceu no menu auxiliar. Então resolvi adicionar o meu namespace manualmente: using System.Data.Entity;

    Mesmo assim continuo recebendo a mensagem de erro:

    The type or namespace name 'DbContext' could not be found (are you missing a using directive or an assembly reference?)

    Preciso resolver o problema dessa camada para seguir em frente. Alguém conhece outro procedimento para resolver isso? Segue meu código:

    using MvcCadastro.Dominio;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data.Entity;

    namespace MvcCadastro.Repositorio
    {
        public class DBContexto : DbContext
        {
            public DBContexto() : base(@"Data Source=(local);initial catalog=CadastroDB;Integrated Security=SSPI") { }
            public DbSet<DadosModelo> Cadastro { get; set; }
        }
    }



    • Editado LWMN quarta-feira, 13 de maio de 2015 16:20
    quarta-feira, 13 de maio de 2015 16:12
  • Olá WMN8,

     em qual projeto você instalou o Entity ? Lembre-se que vc deve instalar pelo que vejo na figura no seu projeto chamado REPOSITORIO e no projeto MvcCadastroUi.Web somente instalar no Repositorio e não no projeto de visualização não vai resolver, vai gerar uma exceção de instância invalida. 

     Então o Entity está instalados nesses DOIS projetos ?

    quarta-feira, 13 de maio de 2015 16:40
  • Via nuget, instala o EntityFramework. Aparentemente ele não está instalado.
    Observe que nas referencias do seu projeto Repositorio não está listando ele.
    quarta-feira, 13 de maio de 2015 16:49
  • Olá WMN8,

     em qual projeto você instalou o Entity ? Lembre-se que vc deve instalar pelo que vejo na figura no seu projeto chamado REPOSITORIO e no projeto MvcCadastroUi.Web somente instalar no Repositorio e não no projeto de visualização não vai resolver, vai gerar uma exceção de instância invalida. 

     Então o Entity está instalados nesses DOIS projetos ?

    Oi Daniel, sim, eu instalei apenas em Repositório. Você quer mais imagens do projeto para entender como ele está?
    quarta-feira, 13 de maio de 2015 18:34
  • Via nuget, instala o EntityFramework. Aparentemente ele não está instalado.
    Observe que nas referencias do seu projeto Repositorio não está listando ele.
    Oi Alexandre, eu sempre instalo via Console do Nuget: Install-Package EntityFramework
    quarta-feira, 13 de maio de 2015 18:36
  • Mas pela imagem que você apresentou, ele não está instalado. Veja se ele instalou no projeto correto. Como você tem vários projetos na solução, pode estar instalando em outro projeto.
    quarta-feira, 13 de maio de 2015 18:46
  • Mas pela imagem que você apresentou, ele não está instalado. Veja se ele instalou no projeto correto. Como você tem vários projetos na solução, pode estar instalando em outro projeto.

    Alexandre, mandei remover todos os pacotes em excesso e mandei reinstalar novamente, dessa vez só na camada Repositório. Agora está compilando:

    Para criar a camada de Domínio tive que tirar a classe da pasta Models e também está compilando:

    using System;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;

    namespace MvcCadastro.Dominio
    {
        [Table("Cadastro")]
        public class DadosModelo
        {
            [Key]
            [Display(Name = "ID")]
            public int CodigoID { get; set; }
            [Display(Name = "Destinatário")]
            public string Nome { get; set; }
            [Display(Name = "Endereço")]
            public string Endereco { get; set; }
            public string Bairro { get; set; }
            public string Cidade { get; set; }
            public string Estado { get; set; }
            [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:#####-####}")]
            public string Cep { get; set; }
            [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:(##)####-####}")]
            public string Telefone { get; set; }
            public string Email { get; set; }
            [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
            public DateTime DataCadastro { get; set; }
        }
    }


    O problema em questão está sendo criar a camada de Aplicação e mudar o modelo que era usado antes sem a camada. Eu utilizava da seguinte forma:

        public class HomeController : Controller
        {
            private DBContexto db = new DBContexto();

            public ActionResult Lista()
            {
                return View(db.Cadastro.ToList());
            }
        }

    Eu preciso em EF passar minhas Actions do meu Controller direto para a minha camada ee Aplicação, em ADO.NET eu coloco na classe DBContexto para usar na minha camada de aplicação. A camada de Aplicação é quem está gerando todo o meu problema o qual não deveria conter o Entity instalado. Depois que refiz este processo camada por camada e método por método a mensagem mudou do EF 4.1.0.0 para o EF 6.0 sendo que estou utilizando o EntityFramework 6.1.3 e também estou tendo o seguinte erro:

    The type 'System.Data.Entity.DbContext' is defined in an assembly that is not referenced. You must add a reference to assembly 'EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.

    E nem cheguei criar os demais métodos para gerar um CRUD. Segue o código atual:

    using MvcCadastro.Dominio;
    using MvcCadastro.Repositorio;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace MvcCadastro.Aplicacao
    {    
        public class CadastroAplicacao
        {
            public DBContexto db { get; set; }

            public CadastroAplicacao()
            {
                db = new DBContexto();
            }

            public IEnumerable<DadosModelo> ListaAll()
            {
                return db.Cadastro.ToList();
            }
        }
    }

    Segue a lista de referência da minha camada de Aplicação:

    Qual seria a melhor forma de fazer esta camada sem precisar instalar o Entity Framework?

    quinta-feira, 14 de maio de 2015 17:42
  • Você tem que instalar o EF em todas as camadas. Não sei se há a possibilidade de não instalar ela na camada UI. O erro está acontecendo, justamente porque você não adicionou o EF nela.
    Se você está trabalhando com uma camada de Repositório, você não precisa acessar o dbcontext da UI.
    • Marcado como Resposta LWMN segunda-feira, 18 de maio de 2015 14:28
    quinta-feira, 14 de maio de 2015 18:16
  • Você tem que instalar o EF em todas as camadas. Não sei se há a possibilidade de não instalar ela na camada UI. O erro está acontecendo, justamente porque você não adicionou o EF nela.
    Se você está trabalhando com uma camada de Repositório, você não precisa acessar o dbcontext da UI.

    Olá pessoal, seguinte, estava com o mesmo problema no meu projeto. Mesmo cenário apresentado pelo alexandre_cavaleiro. Eu verifiquei a pasta bin do projeto de apresentação (MVC) e a DLL do EntityFramework correspondente ao SqlClient não foi copiada (EntityFramework.SqlServer.dll). O problema foi resolvido copiando esta dll para a pasta bin, ela teoricamente faz parte do pacote do entity framework mas não sei explicar o porque na compilação ela não está sendo copiada, todas as propriedades estão configuradas adequadamente para copiar mas não vem.

    Bom, espero que tenha ajudado mais um pouco além da solução de referenciar a DLL no projeto de apresentação.

    Abraços a todos

    quinta-feira, 3 de dezembro de 2015 02:12
  • Você tem que instalar o EF em todas as camadas. Não sei se há a possibilidade de não instalar ela na camada UI. O erro está acontecendo, justamente porque você não adicionou o EF nela.
    Se você está trabalhando com uma camada de Repositório, você não precisa acessar o dbcontext da UI.

    Olá pessoal, seguinte, estava com o mesmo problema no meu projeto. Mesmo cenário apresentado pelo alexandre_cavaleiro. Eu verifiquei a pasta bin do projeto de apresentação (MVC) e a DLL do EntityFramework correspondente ao SqlClient não foi copiada (EntityFramework.SqlServer.dll). O problema foi resolvido copiando esta dll para a pasta bin, ela teoricamente faz parte do pacote do entity framework mas não sei explicar o porque na compilação ela não está sendo copiada, todas as propriedades estão configuradas adequadamente para copiar mas não vem.

    Bom, espero que tenha ajudado mais um pouco além da solução de referenciar a DLL no projeto de apresentação.

    Abraços a todos

    Boa noite Alex, tentei executar o procedimento que você postou, mas não funcionou, vou ver outra forma. Mas agradeço pela tentativa.
    domingo, 6 de dezembro de 2015 00:54