São tantos pontos Luiz!
O melhor nesse ponto é criar uma coesão entre as camadas e analisar sempre o que vai acontecer em cada rotina, porque, você pode quebrar em vários contextos a sua camada de ORM Entity se tiver muitas Entidades em apenas uma. Outro ponto crucial é como
escrever o LINQ, sempre utilize o LINQ TO SQL em vez do LINQ TO OBJECTS
Exemplo:
Linq To SQL: (Correto)
contexto.Pessoas.Where(x => x.Name.Contains("a")).ToList()
Linq To Object (Errado)
contexto.Pessoas.ToList().Where(x => x.Name.Contains("a")).ToList()
Porque: A primeira expressão cria a SQL e retornar o dado já com o filtro, já o segundo traz tudo e depois filtro aumentando a performance e causando um gargalo muito grande.
O ideal seria você trabalhar com ENTITY e um MicroORM ou ADONET Puro para geração mais otimizadas de SQL, tipo para gravar alterar e excluir utilize Entity e para SQL complexas uma camada ADONet ou MicroORM.
Eu já fiz uma aplicação grande com Entity e até hoje não tive problemas, fiz rotinas otimizadas e analisamos cada ponto da aplicação e é bem viável ...
Fulvio C