Utilizar o Entity Framework com Code-First a partir de uma base existente é possível e relativamente fácil, inclusive melhorando a nomenclatura da base.
Neste vídeo tutorial iremos acompanhar como funciona o processo de criação de um sistema novo partindo de uma base já existente e utilizando Entity Framework no modelo Code-First.
Como apresentado no vídeo os modelos guiados por design e que geram EDMX estão obsoletos, geram muita dificuldade na manutenção e não serão mais suportados na próxima versão do Entity Framework (7).
Neste tutorial iremos aprender:
- Diferenças entre Model-First, Database-First e Code-First.
- Instalar o EF Power Tools.
- Customização de templates T4 para geração de classes.
- Fazer engenharia reversa do banco criando classes POCO e mapeamentos com Fluent API.
- Melhorar a nomenclatura das classes e mapeamentos quando o banco de dados não possui padronização ou está num padrão não apropriado para nomenclatura das entidades na aplicação.
- Atualizar o banco de dados com Migrations
- Como atualizar o código quando houver alteração direta no banco de dados.
- Resolver problemas comuns do processo de engenharia reversa.
Vídeo
* Assine meu canal no Youtube 🙂
Vamos continuar com a troca de experiências, deixe seu comentário abaixo.
Referências
Ótimo video muito esclarecedor , estou começando com EF code first com uma database com mais de 500 tabelas, me ajudou muito o power tools, não conhecia, obrigado.
Olá Eduardo,
Admiro o seu trabalho, parabéns pelos artigos e vídeos! Desculpe postar um assunto fora do contexto do artigo, tem mais a ver com DDD, Repository Pattern e Entity Framework.
Tenho dificuldades em implementar o padrão repositório com o EF, pois a abstração limita o acesso às funções do EF. Outro ponto: sempre que preciso de preciso de uma query sou obrigado a escrever um novo método.
Pesquisando sobre o assunto, percebi que não há unanimidade em relação aos benefícios de implementar o padrão repositório junto com EF. Alguns autores sugerem uma outra estratégia, a de usar Query Objecs. Veja abaixo:
http://www.thereformedprogrammer.net/is-the-repository-pattern-useful-with-entity-framework-part-2/
http://rob.conery.io/2014/03/04/repositories-and-unitofwork-are-not-a-good-idea/
http://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/
Poderia escrever um artigo ou gravar um vídeo sobre o assunto?
Muito obrigado!
Gabriel Kaio
Alguém teve esse problema? Ele persistiu mesmo após apagar os arquivos temporários da pasta do visual.
(Exceção de HRESULT: 0x80070057 (E_INVALIDARG))
Fantástico o vídeo, muito bom parabéns!
Muito bom seu tutorial! Me ajudou bastante e foi perfeito para o cenário que temos aqui na empresa. Um Sistema antigo, base antiga e complicada de mexer. Parabéns pelo seu excelente trabalho!!! Dia 16 de maio estarei no ASP.NET conference Brasil para te pedir um autografo!!!
Grande abraço.
Muito obrigado, Eduardo, conserta vai ajudar muitas pessoas a compreender mais o tema de Code-First, para bens pela horas dedicadas para realizar esse videos eu agradeço muito.
Grande abs.
Parabéns, ótima vide aula!!
Segue algumas dúvidas:
Como faço para importar Procedures utilizando o reverse engineering?
Tem algumas diferença na implementação com o Oracle? preciso do Devart?
Caso eu não utilize o Migrations pois meu Banco é administrado por DBA, eu preciso fazer o processo de engenharia reversa sempre que minha base mude?
Vaaleu,
Então, parece que vamos ter que engolir o codefirst atravessado, no Asp.net core a utilização de metadatas para evitar que o scafold apague as validações adicionadas pelo dataannotations nem funciona. Em grandes empresas os bancos são administrados pelo DBA. Missão difícil mudar esta cultura estão optando por partir pra outra linguagem que não te obrigue ao code first. Lamentável…
Olá Eduardo,
Excelente tutorial, como muitos em seu site.
Vendo esse tutorial, me veio uma dúvida que sempre tive.
Co início do projeto, adicionei o Migrations, porém notei que tinha mais problemas com ele, do que sem utilizar-lo.
Existe uma forma de desabilitar o Migrations, tipo “Disable-Migration”?
Olá Eduardo,
Parabéns por mais esse post. Todos eles sempre vem me ajudando bastante.
Porém nos meus projetos sempre optei por modelar a base primeiro no Sql Server e depois importar tudo via DatabaseFirst. Qual será o impacto disso com o novo Entity Framework? E você acha que mais fácil eu fazer tudo em code first ou posso continuar a gerar o banco primeiro e depois converter para code first? Obrigado.
Show de bola seu artigo man. Estou estudando seus vídeos e artigos e aprendendo muito! Excelente didática! Parabéns.
Blza Eduardo tenho uma duvida, estou criando programa windFrom, minha tela principal é o login e depois eu criei telas para auxiliarem os CRUD, criei a classe Contexto e para cada CRUD uma classe para a tabela, no botao cadastra para cada CRUD criei a funcao adicionar no banco instanciando tudo direitinho se erro nem um, na hora de testa compila certo abre as telas quando clico no botão cadastra na linha do ADD diz que nao foi usado a classe do banco, com resolvo isso?
Eduardo,
o que você acha melhor. Um contexto para cada entidade ou um contexto agrupando entidades?
Um contexto para cada entidade seria uma falha grave no projeto, você pode ter N contextos sem problemas, mas em cada contexto um grupo de entidades que se relacionam com alguma parte da sua aplicação.
Estou reescrevendo uma aplicação partindo de uma base existente.
O EF criou uma entidade tbSexo, que caso eu estivesse começando do zero, definiria como um Enum no Domínio.
Estarei infringindo algum princípio de OOP ou DDD ao manter esta entidade tão pequena?
O mundo de TI na área empresaria é uma zona, não sei se é só no Brasil, mas é uma zona principalmente no que se trata de código de programação. Quando se entra em um cliente novo e você é sênior aí sofre demais com a mistureba de formas diferentes de programação e técnicas existentes no mesmo sistema que você deve enfrentar devido ao conhecimento que exigem que você tenha e sendo assim te obrigam a “se virar” pra resolver algo sem facilitar nada porque isto é SUA OBRIGAÇÃO, Ah tá! A parte que você mostra como Melhorar a nomenclatura das classes e mapeamentos e a explicação da dinâmica de uso do Migrations ser ou não ser bom para se usar em um caso ou em outro me deu uma luz pra ter menos medo de fazer engenharia reversa de sistemas já existentes para EF e com certeza, na maioria das vezes, ignorando o migrations porque ele é pouco usual em um local de desenvolvimento grande onde existe analista, programador e DBA, cada um no seu quadrado. Valeu cara, obrigado!
Muito bom! Parabéns!
É bom saber que existem pessoas que compartilham o conhecimento e que, não guardam ele pra si só!
Bom dia Eduardo,
Sou fã de seu trabalho e já acompanho a um tempo seus vídeos e podcasts, eu queria saber se poderia me ajudar no seguinte ponto, vou dar um exemplo eu tenho duas entidades cliente e endereço, mapeie essas duas tabelas que também existem na base, e existe um relacionamento do endereço com o cliente, onde o cliente pode ter vários endereços, quando eu realizo a consulta utilizando linq, para trazer o cliente ele já retorna a lista de endereços que o cliente tem, só que eu não necessito dessas informações e também estou necessitando de mais performance, teria como eu realizar a consulta sem trazer esses endereços?
Você precisa colocar a propriedade de endereço na classe de cliente como virtual, desta forma o EF utilizará lazy loading.
Ótimo video, muito didático… obrigada.
Obrigado pelo feedback Débora.
Muito bom a explicação, parabéns.
Mais tenho uma duvida tenho um projeto antigo que foi utilizado o modelo edmx, como eu posso proceder para atualizar sendo que questão de padrão de tabela esta correto, posso deletar o edmx e seguir estes passos ou existe uma outra maneira?
Fica aqui minha duvida!
Agradeço desde já.
Parabéns , mais um ótimo post e vídeo.
Sobre o mapeamento : Partindo de um cenário onde tenho o banco de dados já criado e logo com o as situações descritas a respeito de nome de tabelas. O que pretendo é realizar o mapeamento (engenharia reversa) desta base de dados e usar o Entity Framework apenas para operações de create, update e delete, e tendo o dapper como opção de consulta. Sobre isso em relação aos tipos dos dados na base de dados (“VARCHAR”, “INT” e assim por diante), seria necessário mapear estas informações de tipo do dado da tabela, visto que não realizaria a alteração da base de dados via migrations, mas sim de maneira “manual” e logo o EF seria apenas para as operações de create, update e delete.
Visto esse cenário, seria necessário realizar este mapeamento de tipo de dados?
Desde já obrigado.
Parabéns pelo vídeo, um material pratico e muito bem explicado. Obrigado pela dedicação em apresentar esse conteúdo que acabou me ajudando muito.
Cara tenho algumas tabelas com, por exemplo, uns 20 campos dos quais eu só utilizarei uns 2 ou 3. Nessa situação eu tenho que criar os modelos com todos os campos e ignorar as propriedades no EntityTypeConfiguration ou existe alguma forma de eu mapear apenas os campos que minha aplicação necessita nos meus modelos?
Grato pela atenção.
Eduardo, no visual studio 2015 não precisa mais instalar esse componente EF Power Tools certo ?
Bom dia,
Parabéns pelo post Eduardo.
Estou com uma dúvida e se poder ajudar seria de bom tamanho.
No EF tenho duas tabelas mapeadas Tabela1 e Tabela2, a IdTabela2 é uma FK na Tabela1.
Quando vou adicionar um registro novo ele adiciona normalmente os dados na Tabela1 e na Tabela2. Mas Quando faço um update, Só os dados da Tabela1 é Alterado o da Tabela2 fica sem ser modificado. Se eu separar a Tabela2 para o seu contexto ele altera os dados.
Estou usando UnitOfWork para trabalhar com vários contextos, será que tem que configurar algo para fazer um update em cascade?
Pra variar, mais uma super-aula. Parabéns, Eduardo. Muito bom.
Alguém teve esse problema? Ele persistiu mesmo após apagar os arquivos temporários da pasta do visual.
(Exceção de HRESULT: 0x80070057 (E_INVALIDARG))
poxa Eduardo esse video me salvou, estamos usando esse maldito do edmx e isso da problema pra karamba, abraços.
Gostaria de uma sugestão a respeito de uma abordagem.
Esse sistema legado possui uma base de dados já consolidada com uma quantidade alta de tabelas (cerca de 300) e volumes de dados.
Vou utilizar o entity framework como ORM, porém estou na dúvida se utilizo o database-first ou se faço o mapeamento dos meus modelos um a um conforme a necessidade. Porquê tenho a opinião de que se eu trouxer esse mapeamento via database-first, vou trazer muita coisa que as vezes nem será necessário.
Qual a sua opinião em relação a essa abordagem?
Boa noite Eduardo,
Este componente de engenharia reversa está presente em todas as versões de visual studio, nos mais atuais?
Obrigado pela atenção
Ate,
Joelso