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?
entity-framework
codefirst
RoboShop
fonte
fonte
Respostas:
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.
fonte
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).
fonte
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,
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.
fonte
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.
fonte
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).
fonte
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?
fonte
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.
fonte