O aplicativo que estou construindo atualmente usa procedimentos armazenados e modelos de classe criados manualmente para representar objetos de banco de dados. Algumas pessoas sugeriram o uso do Entity Framework e estou pensando em mudar para isso, já que não estou muito longe no projeto. Meu problema é que sinto que as pessoas que defendem a EF estão apenas me dizendo o lado bom das coisas, não o lado ruim :)
Minhas principais preocupações são:
- Queremos a validação do lado do cliente usando o DataAnnotations, e parece que eu tenho que criar os modelos do lado do cliente de qualquer maneira, então não tenho certeza de que o EF economizaria tanto tempo de codificação
- Gostaríamos de manter as classes o menor possível ao passar pela rede, e eu li que o uso do EF geralmente inclui dados extras que não são necessários
- Temos uma camada de banco de dados complexa que atravessa vários bancos de dados, e não tenho certeza de que a EF possa lidar com isso. Temos um banco de dados comum com usuários, códigos de status, tipos etc. e várias instâncias de nossos principais bancos de dados para diferentes instâncias do aplicativo. As consultas SELECT podem e farão consultas em todas as instâncias dos bancos de dados, no entanto, os usuários podem modificar apenas objetos que estão no banco de dados em que estão trabalhando no momento. Eles podem alternar bancos de dados sem recarregar o aplicativo.
- Os modos de objeto são muito complexos e muitas vezes há muitas junções envolvidas
Os argumentos para EF são:
- Concorrência. Não precisaria codificar as verificações para ver se o registro foi atualizado antes de cada salvamento
- Geração de código. A EF pode gerar modelos de classe parciais e POCOs para mim, no entanto, não tenho certeza de que isso me pouparia muito tempo, pois acho que ainda precisaríamos criar modelos do lado do cliente para validação e alguns métodos de análise personalizados.
- Velocidade de desenvolvimento, pois não precisamos criar os procedimentos armazenados CRUD para cada objeto de banco de dados
Nossa arquitetura atual consiste em um serviço WPF que lida com chamadas de banco de dados por meio de procedimentos armazenados parametrizados, objetos POCO que vão para / do serviço WCF e do cliente WPF e o próprio cliente de desktop WPF que transforma os POCOs em modelos de classe para fins de validação e Ligação de dados.
Então, minha pergunta é: a EF está certa para isso? Existem armadilhas sobre a EF que eu desconheço?
fonte
Respostas:
Recentemente, eu estava avaliando o Entity Framework e o melhor local que encontrei para problemas e recursos ausentes foi: http://data.uservoice.com/forums/72025-ado-net-entity-framework-ef-feature-suggestions
Os itens com mais votos:
Existem muitos outros problemas na lista Voz do usuário.
Em uma nota lateral, estou bastante animado com o lançamento do EF 4.1, que incluirá a abordagem Code-First ... http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4 -1-release-candidate-available.aspx
Isso pode me levar a experimentar o EF em um aplicativo de produção.
fonte
.ToList()
ou.ToArray
) antes que suas expressões LINQ sejam totalmente definidas. É por isso que ele puxa todos os registros e o torna lento.Fazer ramificação por bug / recurso com EF pode ser notavelmente doloroso no momento da mesclagem. Imagine que duas ramificações A e B façam alterações no banco de dados (o que provavelmente acontecerá muito durante os estágios iniciais de um novo projeto).
Você mescla todos os arquivos "normais" - arquivos cs, etc. E então é hora de mesclar Model.edmx. E de repente você não está apenas mesclando os mapeamentos lógicos entre seu modelo de objeto e banco de dados, mas também as posições das tabelas no diagrama de entidades.
Mesclar Model.edmx é tão doloroso que adotamos uma maneira bastante desagradável que funciona:
fonte
Existem alguns outros benefícios para a EF:
As desvantagens (principalmente se você estiver usando a validação):
object
tipos, portanto, basta ler os metadados. Ainda há muito código inativo extra.Essas são as duas maiores reclamações que tenho. Há vários benefícios, mas você pode obter esses mesmos benefícios do NHibernate. Se o EntityFramework estiver em cima da mesa, peça à equipe que verifique o NHibernate e faça uma rápida busca dos prós / contras do seu projeto.
O problema da classe de metadados é uma dor de cabeça, mas felizmente só tenho tantas entidades que precisam de tags de validação.
A falta de um verdadeiro modo desanexado para seus objetos limita o que você pode fazer em um ambiente da web. O modo anexado é melhor para aplicativos de desktop, que é onde se originaram várias inovações da Microsoft. O modo desanexado é possível , mas muito doloroso. É melhor usar uma ferramenta alternativa neste caso.
fonte
using(EFConnection conn = new EFConnection)
construção. Se você tentar esconder esse objeto em algum lugar para mantê-lo seguro, para poder fazer uma atualização rápida e salvá-lo novamente em uma segundausing(...)
declaração, precisará pensar novamente. Consulte msdn.microsoft.com/en-us/library/bb896271.aspx e msdn.microsoft.com/en-us/library/bb896248.aspx . Usar o EF 3.5 (que eu tive que usar na última versão) não é tão limpo assim.Uma coisa na qual a Microsoft não é muito boa é a compatibilidade com
comparabilidadereversa, especialmente quando se trata de novas tecnologiasEspecificamente, EF1 (.net 3.5) é muito diferente de EF4 (.net 4.0) - o mesmo pode ocorrer na próxima versão.
Eu esperaria um pouco e veria como a tecnologia amadurece.
Enquanto isso, considere usar o nHibernate - não é equivalente, mas é maduro e amplamente utilizado.
fonte
quebrar ...
Eu poderia escrever uma diatribe de 10 páginas. Mas, se você está apenas escrevendo um aplicativo para a Empresa X .. quem se importa então. Mas, se você estiver desenvolvendo um produto de software ... terá que ser muito mais anal
fonte
Verifique isto: http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/
Os pontos principais são:
Observe que o link acima está falando sobre EF1.
Também este link: http://ormeter.net/ mostra que o EF não é o melhor em comparação com outros ORMs em desempenho e suporte a LINQ.
fonte