Quais são os critérios para avaliar um ORM for.NET? [fechadas]

30

Eu estou olhando para avaliar ORMs.

Eu usei SubSonic , Linq-to-SQL e Entity Framework . Eu tenho uma equipe de desenvolvedores que variam de juniores a seniores.

Quais são os critérios para avaliar um ORM for.NET?

Nickz
fonte
8
Não há melhor. Existem muitas opções que têm um conjunto de prós e contras. Cada um traz algo diferente para a mesa.
Tony
Uma afirmação sobre terminologia: eu diria que o SubSonic certamente não é um ORM. Mais de um .. expositor relacional a objeto. Ele pode gerar apenas classes que refletem diretamente o esquema da tabela do banco de dados. Na maioria das vezes funciona bem, mas esse ponto de design é muito importante, pois está em um campo de atuação muito diferente do da EF & NHib.
você
1
@qstarin: isso torna o SubSonic um ORM tanto quanto o LINQ-to-SQL.
John Saunders
muito bom ponto, John e qstarin. é uma linha tênue que você classificaria como um expositor relacional a objeto. O SubSonic 3.0 oferece recursos alinhados com os conceitos do ORM. Wiki diz. "convertendo dados entre sistemas de tipos incompatíveis em linguagens de programação orientadas a objetos. Isso cria, com efeito, um" banco de dados de objetos virtuais "que pode ser usado de dentro da linguagem de programação." além disso, no ormbattle.net, o SubSonic é considerado um ORM. Obrigado a ambos por seus comentários
Nickz
2
Vejo Linq-to-SQL mais como um glorificado sql gerador do que um ORM ...
fretje

Respostas:

43

É uma pergunta carregada.
Existem muitas ORMs muito boas abordando o assunto com diferentes filosofias.
Nenhuma é perfeita e todas tendem a se tornar complexas assim que você se afasta do caminho de ouro (e às vezes até quando se apega a ele).

O que você deve se perguntar ao selecionar um ORM:

  1. O que ele precisa fazer por você?
    Se você já possui um conjunto de requisitos para seu aplicativo, deve selecionar o ORM que melhor corresponda a eles, em vez de um 'melhor' hipotético.

  2. Seus dados são compartilhados ou apenas locais?
    Grande parte da pelagem no ORM é causada pela maneira como eles lidam com a simultaneidade e as alterações nos dados no banco de dados quando vários usuários mantêm uma versão dos mesmos dados.
    Se o seu armazenamento de dados for para um usuário único, a maioria dos ORMs fará um bom trabalho. No entanto, faça a si mesmo algumas perguntas difíceis em um cenário multiusuário: como o bloqueio é tratado? O que acontece quando eu excluo um objeto? Como isso afeta outros objetos relacionados? O ORM está trabalhando próximo ao metal do back-end ou está armazenando muitos dados em cache (melhorando o desempenho às custas de aumentar o risco de staleness).

  3. O ORM está bem adaptado ao seu tipo de aplicação? Um ORM específico pode ser difícil de trabalhar (muita sobrecarga de desempenho, difícil de codificar) se for usado em um serviço ou em um aplicativo da Web. Pelo contrário, pode ser ótimo para aplicativos de desktop.

  4. Você precisa desistir de aprimoramentos específicos do banco de dados?
    Os ORMs tendem a usar o conjunto de SQL com o menor denominador comum para garantir que funcionem com muitos back-end de banco de dados diferentes.
    Todos os ORMs comprometem os recursos disponíveis (a menos que tenham como alvo específico um único back-end), mas alguns permitem implementar comportamentos adicionais para explorar aprimoramentos específicos disponíveis no back-end escolhido.
    Um aprimoramento típico específico do banco de dados são os recursos de pesquisa de texto completo, por exemplo; verifique se o ORM fornece uma maneira de acessar esses recursos, se você precisar deles.

  5. Como o ORM gerencia mudanças no modelo de dados?
    Alguns podem atualizar o banco de dados automaticamente dentro de uma certa medida, outros não fazem nada e você terá que fazer o trabalho sujo; outro fornece uma estrutura para lidar com mudanças que permite controlar as atualizações do banco de dados.

  6. Você pensa em associar seu aplicativo aos objetos do ORM ou prefere manipular POCOs e usar um adaptador para persistência?
    O primeiro é geralmente simples de manusear, mas cria dependências em seus objetos de dados específicos do ORM em qualquer lugar; o segundo é mais flexível, à custa de um pouco mais de código.

  7. Você precisará transferir seus objetos remotamente?
    Nem todos os ORMs são iguais quando se trata de buscar objetos de um servidor remoto; observe atentamente o que é possível ou impossível fazer. Alguns são eficientes, outros não.

  8. Existe alguém para quem você possa pedir ajuda?
    Existe um bom suporte comercial? Quão grande e ativa é a comunidade em torno do projeto?
    Quais são os problemas que os usuários existentes estão enfrentando com o produto?
    Eles obtêm soluções rápidas?

Alguns ORMs que eu analisei:

  • XPO
    Do desenvolvedor Express: é pequeno e simples, centrado no código. Eles o usam em sua estrutura de aplicativos eXpressApp .
  • NHibernate
    É gratuito, mas a curva de aprendizado é bastante íngreme. Muitas vantagens, mas é difícil encontrar o que é realmente relevante às vezes em toda a documentação fragmentada.
  • Projeto
    muito maduro LLBLGen Pro , não o mais simples, mas muito pensamento foi colocado nele.
  • Entity Framework
    GEtting lá. Os últimos lançamentos são muito bons e o MS está ouvindo, embora ainda seja um pouco jovem comparado a outros ORMs mais maduros.
  • DataObject.Net
    Parece promissor, mas também é um pouco novo para arriscar um projeto importante no IMHO. Bastante ativo.

Existem muitos outros, é claro.

Você pode dar uma olhada no controverso site ORM Battle, que lista alguns benchmarks de desempenho, embora você deva estar ciente de que a velocidade bruta não é necessariamente o fator mais importante para o seu projeto e que os produtores do site são o DataObject.Net.

Renaud Bompuis
fonte
3
Sabendo disso, o que você escolheu?
Steven Evers
obrigado Renaud Bompuis, não ouvi falar de algumas das ORMs listadas. As informações que você forneceu são um excelente alimento para reflexão, obrigado.
Nickz # 6/10
1
@SnOrfus: ainda estou usando o XPO, mas vou migrar para o LLBLGen, é sólido, maduro e você permanece no controle (para que você ainda possa sujar as mãos se precisar / deseja) e permite uma separação mais adequada das preocupações e reutilização de objetos (através do adaptador).
Renaud Bompuis
3
Vale a pena notar que o Entity Framework agora está na versão 4.1 e certamente valeria a pena agora.
Sean Kearon
Eu amo Procs armazenados no servidor e LINQ no cliente. Tente fazer um voto negativo! Sem curva de aprendizado, sem surpresas, sem versões, sem surpresas!
NoChance
14

Estou usando o NHibernate e achei muito bom.

No meu caso, vinculado a um banco de dados MS Sql, mas você pode se conectar a outros bancos de dados.

Não demora muito para começar a funcionar - basta mapear seu objeto para o modelo - eu uso um arquivo xml, mas você pode fazê-lo fluentemente em código. Existe uma grande comunidade e, pessoalmente, achei o trabalho de Ayende muito útil - uso o NHProf, que é uma ferramenta de criação de perfil sql.

Uso principalmente as funções prontas para uso - mapeamento direto de objetos, mas também uso a Hibernate Query Language, que é bastante fácil de entender.

Sam J
fonte
Cuidado, o NHibernate pode ser complicado para modelos mais complicados. Está tudo bem documentado e faz muito sentido, mas se você não estiver ciente, poderá encontrar problemas. Ou seja, a curva de aprendizado é alta, mas é excelente.
9138 Matt Olenik #
obrigado Sam, eu não usei o nhibernate, no entanto, parece exigir uma configuração extensa em comparação com o SubSonic, o Linq-to-SQL e o Entity Framework. Isso não seria ideal para minha equipe de desenvolvimento.
Nickz #
Se você estiver interessado, Ayende dará um workshop do NHibernate na conferência YOW Australia - yowconference.com.au/melbourne/events_tracks/… - em novembro / dezembro. Um dos caras com quem trabalho o usou por um tempo, então tive o benefício de aprender com ele.
Sam J
3
@ Nick a maior parte da configuração pode ser automatizada. Eu também verificaria o complemento fluente.
Stonemetal 5/10/10
@ Nick, @stonemetal concordou, o Fluent NHibernate facilita muito as coisas. Não é tão rápido quanto o SubSonic, mas ainda vale a pena dar uma olhada.
Matt Olenik
6

Infelizmente, nos meus últimos três empregos, tivemos três ORMs caseiros. Em cada caso, eles geralmente são sugados por várias razões.

Recentemente, avaliei o Entity Framework 4 e seu suporte ao POCO (uma boa explicação aqui ) e estou realmente impressionado com o quão bem ele fica fora do meu rosto e me faz sentir como se estivesse programando novamente em vez de coletar dados.

Jesse C. Slicer
fonte
Ouvi dizer que, em trabalhos anteriores, estive em uma posição semelhante em ORMs caseiros. obrigado pelo feedback.
Nickz 6/10/10
3
ORMs caseiros sempre são ruins. Os melhores são sempre piores que os ORMs públicos mais ruins.
Jaco Pretorius
@JacoPretorius Existem contra-exemplos para isso ... mas "regra geral" ...
pst
3

Eu gosto muito de Linq to Sql. É simples e tem um designer decente. No entanto, espero encerrá-lo em favor da estrutura da Entidade. Gostaria de aproveitar a capacidade de modificar os geradores para que eu possa ter objetos personalizados.

O maior benefício que eles têm sobre os outros (na minha opinião) é que eles estão fora da caixa com o VS. Isso também é negativo, pois você está à mercê do MS (consulte Linq to Sql).

Jeremy Roberts
fonte
3

[AVISO LEGAL: Eu trabalho para o DevExpress]

Você pode ver capturas de tela de aplicativos típicos criados pelas estruturas de aplicativos do DevExpress aqui . Esta página também contém uma breve revisão de nossos produtos. Para obter informações mais detalhadas sobre o motivo , sugiro que você verifique as respectivas páginas de produtos em nosso site.

Quanto ao DevExpress XAF e XPO, aqui está uma boa explicação sobre por que escolher nossas estruturas de aplicativos. Além disso, fornecemos suporte e documentação, o que também é importante e vale a pena mencionar. Não hesite em contactar-nos em caso de dúvidas.

Dennis Garavsky
fonte
Ainda estou usando o XPO e estou feliz com as próximas atualizações.
Renaud Bompuis
2

Usamos NHibernate + Fluent NHibernate, com Linq-to-Sql em pequenos projetos. A razão para isso é:

1) (Não é o motivo principal) O NHibernate parece ter um fator de "respeito" mais alto entre os desenvolvedores (isso é verdade?),

2) Comparado ao linq-to-SQL, o nHibernate permite o mapeamento ORM entre objetos Db e entidades que não mapeiam 1 para 1,

3) Não comparamos extensivamente o nHibernate ao Entity Framework 4.0, mas aqui está uma boa comparação: http://ayende.com/blog/archive/2010/01/05/nhibernate-vs.-entity-framework-4.0.aspx

O nHibernate possui uma curva de aprendizado bastante íngreme e seus mapas XML podem ser bastante detalhados, mas comece com a documentação do site do Fluent Nhibernate e faça o seu caminho para trás.

fjxx
fonte
1

Não existe uma estrutura "melhor" do ORM porque todos eles têm combinações diferentes de pontos fortes e fracos e, geralmente, se os desenvolvedores optarem por se concentrar em melhorar uma área, há outras áreas que sofrem comparação (código primeiro vs. primeiro modelo versus banco de dados primeiro).

Por outro lado, existem muitos bons, alguns dos quais serão mais adequados às suas circunstâncias e filosofia pessoais do que outros.


Edit: Pelo que vale a pena, atualmente estou usando o Linq to SQL - principalmente porque existe lá, em parte porque faz muito certo com o mínimo de esforço e provavelmente progredirá para o Entity Framework novamente "porque está lá" (embora, similarmente, também exista muito sobre o EF4 que está certo e algumas coisas que estão erradas). A preocupação, especialmente com o último, teria que ser desempenho, mas na maioria dos meus casos isso não é um problema enorme e a capacidade de executar dados dinâmicos e OData dos modelos (L2S e EF) traz benefícios consideráveis ​​para mim em termos de " vitórias baratas.

Murph
fonte
Obrigado pelo seu feedback Murph. Eu concordo com o "melhor" ORM. No entanto, procuro instituir mais padronização. O uso de um dos ORMs ajudará novos desenvolvedores e desenvolvedores existentes em minha equipe. Atualmente, onde o uso de tudo, subsônico, ADO.net, linq-sql e etc., a movimentação entre projetos e manutenção está se tornando mais difícil.
Nickz # 6/10
Ah, não tenho nenhum problema com sua pesquisa de um ORM mais adequado para o (s) seu (s) caso (s) de uso e concordo totalmente com a conveniência de fazer a pergunta a seguir. Estou apenas fazendo uma campanha fútil contra o uso da palavra "BEST" nas perguntas de stackexchange (-:
Murph
1

Aconselho você a dar uma olhada no DevExpress XPO . Isso, juntamente com o DevExpress XAF , facilitará a vida de qualquer desenvolvedor, assim que sua curva de aprendizado for ultrapassada.

Yogi Yang 007
fonte
O XAF é baseado no XPO, que é o ORM. O próprio XAF constrói sobre isso e adiciona a lógica e a interface do usuário "automática" etc.
Sascha 5/10/10
Explique por que você acredita que o DevExpress XAF facilitará a vida de um desenvolvedor.
@ Sascha, obrigado pela sua dica. Eu corrigi minha postagem.
Yogi Yang 007
O @Mark, o XAF e o XPO funcionam como um ORM e também como um gerador de UI, tornando fácil para um desenvolvedor criar aplicativos funcionais completos no .NET com codificação mínima.
Yogi Yang 007
Um comentário do meu lado para o XAF: É um ótimo sistema para ambientes lógicos de negócios de complexidade média, pois acelera o tempo de desenvolvimento para aqueles em fatores. A desvantagem é que, em determinadas fronteiras, é novamente muito demorado estendê-lo. Por exemplo, usuários hierárquicos (junto com lógica como equipes) e 'um usuário pode ver apenas itens de si mesmo e / ou de seus subordinados' não são suportados imediatamente. Portanto, a XAF tem prós e contras, ela realmente precisa ser avaliada se é a opção certa para um projeto - IMHO. Mas é definitivamente uma base bem feita, se for adequada.
Sascha
1

Tivemos boa sorte com o Entity Framework. Porém, nossa situação é algo incomum - fazemos a coleta de dados para a equipe de relatórios, para que eles realmente projetem o banco de dados. Obtemos o banco de dados e, em seguida, usamos EF para gerar as classes de acesso a dados a partir dele. Funciona muito bem para nós, mas apenas fazemos carregamentos de dados em massa, por isso não posso garantir o desempenho de um ambiente mais transacional.

TMN
fonte
2
Sim, eu sou fã do EF 4, é muito melhor que a versão anterior.
Nickz
1

NHibernate (+ FluentNHibernate) seria a opção padrão para mim. É muito flexível, extensível e robusto. Ele tem uma quantidade enorme de usuários e é mantido ativamente. A desvantagem é a curva de aprendizado acentuada.

O LightSpeed ​​do MindScape é simples e fácil de usar, mas ainda bastante flexível e capaz. Ele possui uma superfície de designer como L2S / EF e uma implementação UnitOfWork.

rmac
fonte
O LightSpeed ​​do MindScape parece realmente interessante.
Nickz
1

Bem, não há "melhor" opção, mas eu diria que o Linq to SQL antigo e regular atende às suas necessidades. Não é um ORM "verdadeiro" em si, mas é muito leve e oferece a flexibilidade de escrever código sem estar ciente, se isso faz sentido. O que quero dizer é que você pode continuar escrevendo o código normalmente, sem ter que realmente estar ciente do Linq além de ter o dbml(s) arquivo (s). Você ainda pode escrever abstrações sobre ele, usando os padrões Repository ou Gateway, e o L2S cumpre a função principal de um ORM, que é contornar a Incompatibilidade Objeto-Relacional.

O Entity Framework é um pouco pesado e, embora eu tenha me interessado um pouco, é mais "na sua cara" do que o Linq to Sql básico, mas o EF é muito mais um ORM verdadeiro do que o Linq. Eu examinaria todos os critérios que você está procurando em um ORM. É apenas porque você deseja evitar a necessidade de gravar SQL bruto ou, pior ainda, ter centenas de Procedimentos Armazenados? Você precisa de alguns recursos extras que o Linq to Sql bruto não pode fornecer? Você precisa responder a essas perguntas, mas com base em seu breve requisito ("leve e fácil de usar"), acho que o Linq é um pouco mais fácil do que algo como o Subsonic e está embutido no Visual Studio.

Wayne Molina
fonte
0

ECO :) É muito mais do que um ORM, incluindo máquinas de estado e OCL executável (ou seja, EAL). Existe uma versão gratuita com uma limitação de 12 classes de domínio, que eu acho que deve ser bastante interessante para pequenos projetos.

William
fonte
4
Seria útil se você explicasse o porquê.