Quais são os prós e os contras do uso do Entity Framework 4.1 Code-first over Model / Database-first com diagrama EDMX?
Estou tentando entender completamente todas as abordagens para criar a camada de acesso a dados usando o EF 4.1. Estou usando o padrão Repository e IoC
.
Sei que posso usar a abordagem de primeiro código: defina minhas entidades e contexto manualmente e use-os ModelBuilder
para ajustar o esquema.
Também posso criar um EDMX
diagrama e escolher uma etapa de geração de código que use modelos T4 para gerar as mesmas POCO
classes.
Em ambos os casos, acabo com POCO
objetos ORM
agnósticos e contextos dos quais deriva DbContext
.
O primeiro banco de dados parece ser mais atraente, pois eu posso projetar o banco de dados no Enterprise Manager, sincronizar rapidamente o modelo e ajustá-lo usando o designer.
Então, qual é a diferença entre essas duas abordagens? É apenas sobre a preferência VS2010 vs Enterprise Manager?
fonte
Respostas:
Eu acho que as diferenças são:
Codifique primeiro
Primeiro banco de dados
Modele primeiro
Espero que, no caso da EF 4.1, existam vários outros recursos relacionados ao Code First vs. Model / Database primeiro. A API fluente usada no Code primeiro não oferece todos os recursos do EDMX. Espero que recursos como mapeamento de procedimentos armazenados, visualizações de consulta, definição de visualizações etc. funcionem ao usar o Modelo / Banco de Dados primeiro e
DbContext
(ainda não o testei), mas não no Código primeiro.fonte
DbContext
que existeObjectContext
simplesmente use((IObjectContextAdapter)dbcontext).ObjectContext
.Penso que esta simples "árvore de decisão" de Julie Lerman, autora de "Programming Entity Framework", deve ajudar a tomar a decisão com mais confiança:
Mais informações aqui .
fonte
O banco de dados primeiro e o modelo primeiro não têm diferenças reais. O código gerado é o mesmo e você pode combinar essas abordagens. Por exemplo, você pode criar um banco de dados usando o designer, além de alterar o banco de dados usando o script sql e atualizar seu modelo.
Ao usar o código primeiro, não é possível alterar o modelo sem o banco de dados de recreação e a perda de todos os dados. IMHO, essa limitação é muito rigorosa e não permite usar o código primeiro na produção. Por enquanto não é realmente utilizável.
A segunda desvantagem menor do código é que o construtor de modelos exige privilégios no banco de dados mestre. Isso não afeta você se você estiver usando o banco de dados SQL Server Compact ou se você controla o servidor de banco de dados.
A vantagem do código primeiro é um código muito limpo e simples. Você tem controle total desse código e pode modificá-lo e usá-lo facilmente como seu modelo de exibição.
Posso recomendar o uso da primeira abordagem de código ao criar um aplicativo autônomo simples sem controle de versão e usar model \ database primeiro em projetos que exigem modificação na produção.
fonte
Citando as partes relevantes de http://www.itworld.com/development/405005/3-reasons-use-code-first-design-entity-framework
fonte
O código primeiro parece ser a estrela em ascensão. Eu dei uma olhada rápida no Ruby on Rails, e o padrão deles é o primeiro do código, com migrações de banco de dados.
Se você estiver criando um aplicativo MVC3, acredito que o Code primeiro tenha as seguintes vantagens:
Atualizar
A pergunta também pede uma comparação do code-first com o modelo EDMX / db-first. O Code-first também pode ser usado para essas duas abordagens:
fonte
Eu uso o banco de dados EF primeiro para fornecer mais flexibilidade e controle sobre a configuração do banco de dados.
O código EF primeiro e o modelo pareciam legais inicialmente e fornecem independência de banco de dados; no entanto, ao fazer isso, não permite especificar o que considero informações de configuração de banco de dados muito básicas e comuns. Por exemplo, índices de tabela, metadados de segurança ou possui uma chave primária que contém mais de uma coluna. Acho que quero usar esses e outros recursos comuns do banco de dados e, portanto, tenho que fazer alguma configuração do banco de dados diretamente de qualquer maneira.
Acho que as classes POCO padrão geradas durante o banco de dados primeiro são muito limpas, no entanto, faltam atributos de anotação de dados muito úteis ou mapeamentos para procedimentos armazenados. Eu usei os modelos T4 para superar algumas dessas limitações. Os modelos T4 são impressionantes, especialmente quando combinados com seus próprios metadados e classes parciais.
O modelo primeiro parece ter muito potencial, mas está me dando muitos bugs durante a refatoração de esquema de banco de dados complexo. Não sei por que.
fonte
Trabalhar com modelos grandes era muito lento antes do SP1 (não tentei depois do SP1, mas diz-se que é um estalo agora).
Ainda projeto minhas tabelas primeiro e, em seguida, uma ferramenta interna gera os POCOs para mim, portanto, é preciso fazer tarefas repetitivas para cada objeto poco.
Quando você usa sistemas de controle de origem, pode acompanhar facilmente o histórico de seus POCOs, não é tão fácil com o código gerado pelo designer.
Eu tenho uma base para o meu POCO, o que facilita bastante as coisas.
Eu tenho visões para todas as minhas tabelas, cada visão base traz informações básicas para minhas chaves estrangeiras e meus pontos de vista derivam de minhas classes POCO, o que é bastante útil novamente.
E, finalmente, não gosto de designers.
fonte
Exemplo de primeira abordagem do banco de dados:
Sem escrever nenhum código: ASP.NET MVC / MVC3 Database Approach First / Database First
E acho que é melhor do que outras abordagens, porque a perda de dados é menor com essa abordagem.
fonte
IMHO Acho que todos os modelos têm um ótimo lugar, mas o problema que tenho com a primeira abordagem do modelo está em muitas empresas de grande porte, com os DBAs controlando os bancos de dados. Você não obtém a flexibilidade de criar aplicativos sem usar as primeiras abordagens de banco de dados. Já trabalhei em muitos projetos e, quando se tratava de implantação, eles queriam controle total.
Portanto, por mais que eu concorde com todas as variações possíveis, o Code First, Model First, Database primeiro, você deve considerar o ambiente de produção real. Portanto, se seu sistema for um grande aplicativo de base de usuários, com muitos usuários e DBAs executando o programa, considere a primeira opção do banco de dados apenas minha opinião.
fonte
Acho que uma das vantagens do código é que você pode fazer backup de todas as alterações feitas em um sistema de controle de versão como o Git. Como todas as suas tabelas e relacionamentos são armazenados no que são essencialmente apenas classes, você pode voltar no tempo e ver qual era a estrutura do seu banco de dados antes.
fonte