O CodeFirst é destinado a aplicativos de grande escala?


16

Estive lendo o Entity Framework, em particular, o EF 4.1 e seguindo este link ( http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity- framework-4.aspx ) e seu guia sobre o Code First.

Acho que é legal, mas eu estava pensando: o Code First deveria ser apenas uma solução para o desenvolvimento rápido, onde você pode entrar sem muito planejamento ou é realmente destinado a ser usado para aplicativos de grande escala?


Eu acho que a abordagem do primeiro código é mais adequada para zombar. Portanto, é mais amigável ao teste.
precisa

9
O Code-first é, no mínimo, uma excelente tecnologia para transformar seu DBA em uma espuma incontrolável. Assim, não pode ser de todo ruim.
3Sphere 25/10/11

Respostas:


17

Posso ter alguns detratores por aí, mas quando li alguns desses posts de Hanselman e Gutherie, depois li o livro de Julia Lerman sobre o Entity Framework, tive MUITO dificuldade com o código primeiro. Nos meus muitos anos de criação de aplicativos, segui muitos caminhos, forçados por processos e por opção, e descobri que tenho muito mais sucesso ao adotar uma visão centrada em dados ao criar um aplicativo.

Estou falando de aplicativos de linha de negócios aqui ... é quando você tem um problema ou processo de negócios que precisa ter uma solução de software por trás dele. Você tem dados que precisam ser gerenciados de alguma forma. É melhor conhecer seus dados e como eles se relacionam e como são usados ​​na empresa. Portanto, você modela esses dados e cria um aplicativo / solução em torno deles. Na minha experiência, se você começar a criar o aplicativo com os dados como uma reflexão tardia, alguma coisa será deixada de fora e você terá alguma refatoração (em muitos casos - refatoração MAJOR).

Aplicativos pequenos podem ser uma exceção, mas continuarei usando minha abordagem centrada em dados.


2
Isso pode ser porque a abordagem ainda é um pouco estranha para mim e posso mudar de idéia mais tarde, mas mesmo para aplicativos pequenos, sinto que ainda ficaria mais confortável construindo a partir do banco de dados primeiro. Apenas parece ser o ponto mais lógico para começar.
RoboShop

5
Mesmo quando você baseia seu banco de dados no CodeFirst, ainda está usando uma abordagem centrada em dados. Você está apenas modelando seus dados usando classes .Net em vez de banco de dados estrito. Se você pode modelar seus dados em classes .net, o que você precisaria fazer para saber como usá-los, não vejo como esse é um grande obstáculo para permitir que a EF crie o esquema para suportar esse modelo de dados.
KallDrexx

1
Eu também gostaria de acrescentar que, a menos que você esteja no EF 5.0+ e .NET 4.5+, a escolha do Code First colocará limitações de desempenho no seu aplicativo devido à impossibilidade de gerar objetos CompiledQuery. Eu estou atualmente no processo de mover uma aplicação a partir CodeFirst ao banco de dados Primeiro, porque nós estamos presos com a EF 4.3
Esteban Brenes

Um problema de negócios implica processos de negócios, o que implica comportamento. Os dados geralmente são um efeito colateral desse comportamento (a menos que você esteja falando de aplicativos CRUD simples), então, na minha opinião, é melhor focar na modelagem do comportamento primeiro, em vez de modelar um banco de dados primeiro.
Stefan Billiet

5

Não vejo por que o CodeFirst não pode ser usado em grandes projetos empresariais. Vou dizer que uso o EF CodeFirst em vários projetos, um em que o banco de dados é gerado pelo meu modelo EF CodeFirst e o segundo em que o EF CodeFirst é mapeado para um banco de dados existente.

Pela minha experiência, a eficácia do CF em um projeto grande depende muito da abstração da camada de dados da camada de negócios.

Por exemplo, em um dos meus projetos, a camada de negócios chama diretamente o banco de dados através do linq. Uso o Linq para abstrair minha camada de banco de dados e uso o CodeFirst para mapear meus POCOs no esquema do banco de dados. Nesse caso, o CodeFirst simplifica bastante o ato de manter as diferenças entre as convenções de banco de dados (nomes de relacionamento e de tabela) e os nomes de minhas classes C #, e posso fazer alterações no banco de dados sem ter que afetar muito a maneira como minha camada de negócios interage com o banco de dados.

No entanto, em outro projeto, abstraí o acesso ao banco de dados em um padrão de repositório não genérico, e os métodos Get * do meu repositório são os únicos responsáveis ​​pela execução de consultas no banco de dados e retornam objetos reais (não IQueryable<T>s). Nesse caso, os métodos do repositório estão convertendo entidades do DB em entidades do POCO e, nesse caso, o CodeFirst não oferece tantos benefícios a você quanto os POCOs do CodeFirst têm vida curta e são rapidamente convertidos em classes C # da camada de negócios.

Por fim, depende realmente de como a equipe está estruturada e de quão confortável a equipe (ou os idosos estão) com os engenheiros que não são do DBA, modificando os esquemas do banco de dados e quantas mudanças de esquema afetarão sua estrutura de código. Com o CodeFirst mapeado para um banco de dados existente, é trivial remapear uma propriedade para um novo nome de coluna sem ter que fazer uma renomeação global desse nome de propriedade, o que é especialmente um fator quando você está falando sobre um nome que faz mais sentido para um campo de banco de dados em vez de uma propriedade C #. Também é trivial para mim adicionar suporte ao código para novos campos de banco de dados sem precisar remodelar completamente minhas entidades C # (uma das razões pelas quais deixei o Linq-to-sql para o EF CodeFirst a partir de um banco de dados existente).


4

O Code First não é adequado para aplicações em larga escala. A recuperação do desenvolvimento de aplicativos em grande escala é muito grande.

Normalmente, o ciclo de vida do seu aplicativo de negócios é como,

  1. A versão 1 está em produção
  2. A versão 2 está na versão beta
  3. A versão 3 está em desenvolvimento ativo
  4. A versão 4 está em planejamento.

E existem outras pontes de comunicação entre aplicativos, algumas tarefas agendadas, alguma integração de terceiros, serviços da Web para alguns dispositivos de comunicação diferentes, como dispositivos móveis etc.

Eventualmente, o Code First usa o ObjectContext do Entity Model, o EF mais antigo gerando EDMX e o uso do ObjectContext com EntityObject foram realmente suficientes para tudo. Você pode personalizar facilmente o modelo de texto para gerar código. O método Detect Changes é mais lento com a implementação do ObjectContext, mas, em vez de gerar proxy, a equipe da EF poderia ter facilmente melhorado a velocidade de Detect Changes, em vez de reinventar o código primeiro.

Migração automatizada

A migração automatizada parece boa em teoria, mas impossível na prática quando você entra no ar. É bom apenas para a criação de protótipos, desenvolvendo algumas demos rápidas.

A migração do Code First não é de todo adequada nesse sistema. As versões 1 e 2 provavelmente conversam com o mesmo banco de dados. A versão 3 e a versão 4 geralmente são preparadas e têm um banco de dados diferente.

Primeiro banco de dados

O Database First é uma abordagem prática, é fácil comparar, visualizar e manter scripts SQL. DBAs podem trabalhar com facilidade.

Modelos de texto

Criamos nossos próprios modelos de texto para consultar e criar EDMX e ObjectContext com pouca implementação personalizada que resolve problemas de desempenho. Existem vários aplicativos com várias versões se comunicando com o mesmo banco de dados sem problemas.

Para mim, clicar com o botão direito do mouse no arquivo .tt e clicar em "Executar ferramenta personalizada" é a etapa mais rápida e fácil do que escrever classes, configurar e criar modelo.


As migrações destinam-se exatamente ao cenário que você descreve.
Casey #

Todas as migrações (e não precisam ser executadas automaticamente) descrevem a série de alterações no banco de dados que você deseja fazer no código. Se não houver conflito entre o modelo antigo e o novo (ou você não precisa de alterações no banco de dados), não há motivo para não ter duas versões usando o mesmo banco de dados.
Casey #

2
@Casey Isso é um grande SE, quando se considera o tempo de vida de uma aplicação :)
BVernon

3

Normalmente, para projetos grandes, o banco de dados já foi criado. Ou porque é um banco de dados legado ou criado por um dba competente para desempenho. O único benefício do CodeFirst é se você não deseja usar as entidades da EF, mas os POCOs.


2

Parece-me que "Code First" se destina ao uso de EF com mais "agilidade" (não mexa muito nesse termo, não necessariamente a metodologia) e aplicativos greenfield, nos quais você não tem um modelo de dados existente ou dados existentes; o tipo de aplicativo que você também pode usar Django, ou uma estrutura PHP ou Rails para seguir as diretrizes dessas estruturas, que normalmente envolvem a criação do modelo de dados como parte do código, em vez de criar um aplicativo em torno de um modelo de dados tradicional. Microsoft maneira de lidar com as coisas.

Então, para responder à pergunta, eu diria que não; se você já possui dados e está criando um aplicativo para lidar com isso, o Code First não faz tanto sentido. No entanto, e eu não usei muito o EF, muito menos o Code First EF, parece que é uma abordagem mais fracamente acoplada ao código, o que é sempre benéfico. Supondo que você possa usar o Code First e, em seguida, ainda aponte a classe para um modelo de dados existente (em vez de ser forçado a gerar o modelo), a abordagem do Code First ainda pode ajudar a escrever código adequadamente abstraído e testável sem todo o "problema" usual de usar Estrutura de entidades (ou seja, as metaclasses geradas).


Eu tenho um aplicativo em execução com mais de 400 e tudo foi criado usando a abordagem EF do código primeiro, consegui usar a abstração, a herança muito mais fácil do que outras abordagens de modelagem (banco de dados primeiro, modelo primeiro), aconselho o uso da primeira abordagem do código desde isso lhe dará o controle sobre o código e é fácil de manter, e você não perderá nada em termos de desempenho e tempo de codificação.
Monah

1

Eu diria que em projetos realmente grandes, o código primeiro não faz sentido.

De fato, quando o projeto fica realmente grande, você costuma ter uma separação estrita de preocupações. Você não pode ter a mesma pessoa escrevendo código C #, criando design de banco de dados, escrevendo HTML / CSS e criando visual no Photoshop. Em vez disso, o design do banco de dados é feito por um administrador de banco de dados (ou pelo menos por uma pessoa dedicada que conhece seu trabalho).

Como o banco de dados é projetado por uma pessoa familiarizada com o banco de dados, SQL e as ferramentas de administração e design de banco de dados, seria estranho vê-la usando o Entity Framework.

Além disso, não tenho certeza se o Entity Framework é poderoso o suficiente para projetar o banco de dados corretamente. E os índices? Restrições? Visualizações?


Oi, sim, foi o que pensei. Acho que acho legal, mas não vejo nenhuma vantagem em fazê-lo como costumava fazer, que foi o primeiro projeto do banco de dados. Eu só queria ter certeza de que não era porque havia algo que eu não entendia direito.
RoboShop

Adicionamos uma biblioteca de extensões para o nosso projeto, muito grande, que nos permite anotar índices nas entidades que primeiro codificam - funciona muito bem e é relativamente fácil de criar.
22812

1

Primeiro, o código é viável para sistemas grandes: basta examinar o modelo após a criação e remapear usando a API fluente até atingir o modelo db desejado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.