none
EntityFramework Projetos de grande porte (Melhores Práticas) RRS feed

  • Pergunta

  • Caros amigos do grupo,

     

    Gostaria de uma opinião de vocês com uma situação que estamos vivenciando. Estamos desenvolvendo aplicação de porte significativo, para tanto fizemos um projeto em camadas, modelo DAO, onde minha pretensão é utilizar o EntityFramework, entretanto, como trata-se de um projeto distribuído montado sob o WCF, estou avaliando a melhor forma de trafegar dados entre as camadas . O meu modelo funciona da seguinte forma:

     

    DAO

    OR (com EntityFramework)

     

    BLL

    WCF que acessa a BLL (Expõe funcionalidades)

    ------------------------------------------------------------------------

    UI Cliente  -  Consome o serviço

    ----------------------------------------------------------------------

    Consome o serviço / OR (Através do serviço)

     

    Os serviços no WCF são separados por funcionalidades, ou seja, todas as funcionalidades relativas a determinado assunto no sistema estão em um mesmo serviço.

     

    Até ai tudo bem. Consigo acessar os objetos através do contexto do EntityFramework sem problemas. Inclusive quando adiciono o serviço WCF ao cliente, também posso a ter acesso aos objetos/tabelas. Através desta instância do serviço  WCF“isso é bem legal”

     

    O problema realmente começa ao consumir alguns serviços.

     

    Faço o registro, adicionando o serviço que desejo consumir na UI, e as operações básicas como Alterar, incluir, excluir funcionam bem, apenas passo o objeto e o EF faz tudo, entretanto, se eu precisar obter uma lista de dados, as dúvidas começam a surgir.

     

    1.       Qual a melhor maneira de obter listas utilizando o EntityFramework. Gostaria de obter DataTable, pois me parece que este conjunto trafega muito bem entre o WCF e o UI, mas com EF, não vi uma forma prática de fazer isso (sem laços).

     

    2.       Quando retorno uma Lista genérica do meu EF existe a inconveniente “Propriedade”  “Navigation Property” Quando carregamos a lista através do WCF por algum motivo ela cria os campos EntityKay cujo valor e o namespace do projeto (isso definitivamente, não faço a menor idéia porque acontece J). Quando a lista é criada normalmente, sem a utilização do WCF, aparece o valor da tabela com a qual a tabela se relaciona (também não entendo bem pra que isso).

     

    3.       Quanto a relatórios e consultas, uma vez que utilize o EF, qual a recomendação? Como obter um conjunto de dados para carregar um relatório ou uma consulta complexa com muito Joins, etc., pela experiência de vocês, LAMBDA resolve? Devo utilizar procedures, como vocês tratam isso na prática?

     

    4.       Sobre o EDMX, atualmente meu banco esta todo em um arquivo só (EDMX) esta é uma boa prática? Com bancos “gigantes”, devo proceder da mesma forma?

    Bom, ainda tenho dúzias de perguntas (rsrsrsrs), mas acho que solucionando estas, já posso evoluir com meu trabalho com mais clareza. J

     

    Ficarei imensamente grato se puderem comentar e colabora com esta discussão,  pois, pelo que tenho visto há ainda muita dúvida sobre a utilização do EF em projetos de porte mais significativo. E será por certo de grande ajuda, para mim e demais colegas que estejam no mesmo barco J

     

    Abraço a todos e uma ótima semana!!

     

     

    Edson Motta, PMP®, ITIL®

    Gerente de Projetos, Especialista em Gestão da Informação

    e Business Intelligence, Integrações ETL, BPM® Consultant,

    PMP®, ITIL® Certificate.

     

    Sphera Tecnologia da Informação


    Gerente de Projetos, Analista Business Intelligence, Integrações ETL, Mapeamento de Processos Organizacionais - BPM Consultant.
    segunda-feira, 8 de agosto de 2011 12:24

Respostas

Todas as Respostas

  • Caros amigos do grupo,

     

    Gostaria de uma opinião de vocês com uma situação que estamos vivenciando. Estamos desenvolvendo aplicação de porte significativo, para tanto fizemos um projeto em camadas, modelo DAO, onde minha pretensão é utilizar o EntityFramework, entretanto, como trata-se de um projeto distribuído montado sob o WCF, estou avaliando a melhor forma de trafegar dados entre as camadas . O meu modelo funciona da seguinte forma:

     

    DAO

    OR (com EntityFramework)

     

    BLL

    WCF que acessa a BLL (Expõe funcionalidades)

    ------------------------------------------------------------------------

    UI Cliente  -  Consome o serviço

    ----------------------------------------------------------------------

    Consome o serviço / OR (Através do serviço)

     

    Os serviços no WCF são separados por funcionalidades, ou seja, todas as funcionalidades relativas a determinado assunto no sistema estão em um mesmo serviço.

     

    Até ai tudo bem. Consigo acessar os objetos através do contexto do EntityFramework sem problemas. Inclusive quando adiciono o serviço WCF ao cliente, também posso a ter acesso aos objetos/tabelas. Através desta instância do serviço  WCF“isso é bem legal”

     

    O problema realmente começa ao consumir alguns serviços.

     

    Faço o registro, adicionando o serviço que desejo consumir na UI, e as operações básicas como Alterar, incluir, excluir funcionam bem, apenas passo o objeto e o EF faz tudo, entretanto, se eu precisar obter uma lista de dados, as dúvidas começam a surgir.

     

    1.       Qual a melhor maneira de obter listas utilizando o EntityFramework. Gostaria de obter DataTable, pois me parece que este conjunto trafega muito bem entre o WCF e o UI, mas com EF, não vi uma forma prática de fazer isso (sem laços).

     

    2.       Quando retorno uma Lista genérica do meu EF existe a inconveniente “Propriedade”  “Navigation Property” Quando carregamos a lista através do WCF por algum motivo ela cria os campos EntityKay cujo valor e o namespace do projeto (isso definitivamente, não faço a menor idéia porque acontece J). Quando a lista é criada normalmente, sem a utilização do WCF, aparece o valor da tabela com a qual a tabela se relaciona (também não entendo bem pra que isso).

     

    3.       Quanto a relatórios e consultas, uma vez que utilize o EF, qual a recomendação? Como obter um conjunto de dados para carregar um relatório ou uma consulta complexa com muito Joins, etc., pela experiência de vocês, LAMBDA resolve? Devo utilizar procedures, como vocês tratam isso na prática?

     

    4.       Sobre o EDMX, atualmente meu banco esta todo em um arquivo só (EDMX) esta é uma boa prática? Com bancos “gigantes”, devo proceder da mesma forma?

    Bom, ainda tenho dúzias de perguntas (rsrsrsrs), mas acho que solucionando estas, já posso evoluir com meu trabalho com mais clareza. J

     

    Ficarei imensamente grato se puderem comentar e colabora com esta discussão,  pois, pelo que tenho visto há ainda muita dúvida sobre a utilização do EF em projetos de porte mais significativo. E será por certo de grande ajuda, para mim e demais colegas que estejam no mesmo barco J

     

    Abraço a todos e uma ótima semana!!

     

     

    Edson Motta, PMP®, ITIL®

    Gerente de Projetos, Especialista em Gestão da Informação

    e Business Intelligence, Integrações ETL, BPM® Consultant,

    PMP®, ITIL® Certificate.

     

    Sphera Tecnologia da Informação

     

     

     


    Gerente de Projetos, Analista Business Intelligence, Integrações ETL, Mapeamento de Processos Organizacionais - BPM Consultant.

    segunda-feira, 8 de agosto de 2011 12:02
  • Caros amigos do grupo,

     

    Gostaria de uma opinião de vocês com uam situação que estamos vivenciando. Estamos desenvolvendo aplicação de porte significativo, para tanto fizemos um projeto em camadas, modelo DAO, onde minha pretensão é utilizar o EntityFramework, entretanto, como trata-se de um projeto distribuído montado sob o WCF, estou avaliando a melhor forma de trafegar dados entre as camadas . O meu modelo funciona da seguinte forma:

     

    DAO

    OR (com EntityFramework)

     

    BLL

    WCF que acessa a BLL (Expõe funcionalidades)

    ------------------------------------------------------------------------

    UI Cliente  -  Consome o serviço

    ----------------------------------------------------------------------

    Consome o serviço / OR (Através do serviço)

     

    Os serviços no WCF são separados por funcionalidades, ou seja, todas as funcionalidades relativas a determinado assunto no sistema estão em um mesmo serviço.

     

    Até ai tudo bem. Consigo acessar os objetos através do contexto do EntityFramework sem problemas. Inclusive quando adiciono o serviço WCF ao cliente, também posso a ter acesso aos objetos/tabelas. Através desta instância do serviço  WCF“isso é bem legal”

     

    O problema realmente começa ao consumir alguns serviços.

     

    Faço o registro, adicionando o serviço que desejo consumir na UI, e as operações básicas como Alterar, incluir, excluir funcionam bem, apenas passo o objeto e o EF faz tudo, entretanto, se eu precisar obter uma lista de dados, as dúvidas começam a surgir.

     

    1.       Qual a melhor maneira de obter listas utilizando o EntityFramework. Gostaria de obter DataTable, pois me parece que este conjunto trafega muito bem entre o WCF e o UI, mas com EF, não vi uma forma prática de fazer isso (sem laços).

     

    2.       Quando retorno uma Lista genérica do meu EF existe a inconveniente “Propriedade”  “Navigation Property” Quando carregamos a lista através do WCF por algum motivo ela cria os campos EntityKay cujo valor e o namespace do projeto (isso definitivamente, não faço a menor idéia porque acontece J). Quando a lista é criada normalmente, sem a utilização do WCF, aparece o valor da tabela com a qual a tabela se relaciona (também não entendo bem pra que isso).

     

    3.       Quanto a relatórios e consultas, uma vez que utilize o EF, qual a recomendação? Como obter um conjunto de dados para carregar um relatório ou uma consulta complexa com muito Joins, etc., pela experiência de vocês, LAMBDA resolve? Devo utilizar procedures, como vocês tratam isso na prática?

     

    4.       Sobre o EDMX, atualmente meu banco esta todo em um arquivo só (EDMX) esta é uma boa prática? Com bancos “gigantes”, devo proceder da mesma forma?

    Bom, ainda tenho dúzias de perguntas (rsrsrsrs), mas acho que solucionando estas, já posso evoluir com meu trabalho com mais clareza. J

     

    Ficarei imensamente grato se puderem comentar e colabora com esta discussão,  pois, pelo que tenho visto há ainda muita dúvida sobre a utilização do EF em projetos de porte mais significativo. E será por certo de grande ajuda, para mim e demais colegas que estejam no mesmo barco J

     

    Abraço a todos e uma ótima semana!!

     

     

    Edson Motta, PMP®, ITIL®

    Gerente de Projetos, Especialista em Gestão da Informação

    e Business Intelligence, Integrações ETL, BPM® Consultant,

    PMP®, ITIL® Certificate.

     

    Sphera Tecnologia da Informação


    segunda-feira, 8 de agosto de 2011 12:13
  • Amigo, segue algumas considerações, espero que ajude:

    1. Uma padrão adotado pelo mercado e altamente difundido com a supremacia das boas práticas é o Domain Driven Design

    http://www.typo3-media.com/blog/domain-driven-design-introduction.html

    http://www.agileandart.com/2010/07/16/ddd-introducao-a-domain-driven-design/

    http://microsoftnlayerapp.codeplex.com/

    Neste último link, você poderá ver no diagrama apresentado ao final do site, uma camada chama de Aplicação, o conceito dela é reunir todas as entidades a serem trafegadas em um único objeto chamado DTO, assim desacoplando sua camada de serviços da camada de apresentação

    http://aspalliance.com/1215_implementing_a_generic_data_transfer_object_in_c

    2. A propriedade Navigation Proprety foi gerada pelo Entity Framework, pelo visto você deve está usando as entidades geradas do mapeamento de seu Banco de Dados, ou então gerou o mapeamento via Database First. Uma boa prática seria a utilização de entidades POCOs ligadas a seu projeto http://unplugged.giggio.net/post/Como-funciona-POCO-no-Entity-Framework-4.aspx

    assim você irá manter as entidades de sua aplicação independente de framework de ORM e ainda assim funcionando com o mapeamento do EF4

    3. Para consultas complexas, eu não uso lambda expressions, e sim Entity SQL, bastante similiar ao SQL, é a estrutura SQL direta no EF, mais rápida e simples de fazer consultas dinamicas

    http://olavooneto.wordpress.com/2011/04/08/entity-sql/

    http://blogs.msdn.com/b/adonet/archive/2007/05/30/entitysql.aspx

    http://www.marcosfelipe.com/crud-com-entity-to-sql-parte-1/

    4. Não é possivel utilizar EDMX diferentes para o mesmo banco, como tambem não é possivel utilizar bancos diferentes para o mesmo EDMX. Um contexto é único. O tamanho do banco de dados não é relevane e sim a forma como você o utiliza e como suas tabelas se relacionam. Uma coisa muito importante é manter a forma correta de como suas entidades irão carregas as entidades que se relacionam, veja o link a seguir:

    http://msdn.microsoft.com/en-us/library/bb896272.aspx

     

    Espero ter ajudado.


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    segunda-feira, 8 de agosto de 2011 16:13
    Moderador
  • Caro Olavo,

     

    Fico imensamente grato pelo seu feedback, vou analisar os Links que me enviou e lhe dou um retorno. Possivelmente lhe abusando mais um pouco com algumas eventuais dúvidas:-)

     

    Forte Abraço,

     

    Edson


    Gerente de Projetos, Analista Business Intelligence, Integrações ETL, Mapeamento de Processos Organizacionais - BPM Consultant.
    • Marcado como Resposta Edson Motta quarta-feira, 10 de agosto de 2011 01:10
    • Não Marcado como Resposta Edson Motta quarta-feira, 10 de agosto de 2011 01:10
    quarta-feira, 10 de agosto de 2011 01:09
  • Olá a todos!

     

    Caro Olavo, Excelente material, têm nos ajudado bastante.


    Abusando um pouco mais de sua boa vontade e dos demais, deixe-me perguntar mais uma coisa.

     

    Imagine que tenho duas tabelas Clientes e Produtos e preciso apresentar esse conjunto de dados em um Grid.

     

    Na documentação do EntitySQL percebi que sempre devo referenciar o objeto que estou retornando, fazendo uma consulta pra Cliente e outra para Produtos.

     

    Dim Query1 As New ObjectQuery(Of Cliente)("SELECT VALUE CLI FROM SuplyAppEntities.Cliente AS CLI ", c)

            DataGridView1.DataSource = Query1.ToList

     

    Dim Query2 As New ObjectQuery(Of Empresa)("SELECT VALUE EMP FROM SuplyAppEntities.EmpresaAS EMP ", c)

            DataGridView1.DataSource = Query2.ToList

     

    Pergunta: Como eu posso retornar um “JOIN” com o resultado das duas tabelas(Cliente e Produtos) em uma consulta e popular em um Grid utilizando EntitySQL?

     

    ps. Verifiquei que posso fazer consultas mais flexíveis e genéricas utilizando “EntityCommand / EntityDataReader

     

    Dim _commandText As String = "SELECT VALUE CLI FROM SuplyAppEntities.Cliente AS CLI"

    cmd.CommandText = _commandText

    Dim reader As EntityDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)

    If reader.Read Then

    End If

     

    Mas o retorno e um objeto EntityDataReader, não da pra carregar no grid  apenas fazendo um Bind, teria que ser um a um.

     

    Fico grato pela ajuda,

     

    Forte abraço a todos

     

     

    Edson


    Gerente de Projetos, Analista Business Intelligence, Integrações ETL, Mapeamento de Processos Organizacionais - BPM Consultant.
    terça-feira, 16 de agosto de 2011 03:26
  • Amigo, na verdade você consegue fazer Joins direto na sintaxe do Entity SQL, veja por exemplo:

    var clientes = new ObjectQuery<Cliente>("select VALUE c from Cliente as c join Venda as v ON v.Cliente.Id = c.Id where c.Id = 1", ex);
          var q = clientes.ToList();
    


    O link abaixo tem excelente exemplos:

    http://blogs.msdn.com/b/adonet/archive/2007/05/30/entitysql.aspx

    Quando você utiliza o EntityDataReader você está pulando a fase de construção do seus objetos e tornando isso manual. outro ponto é que o EntityDataReader não muda muito do SQLDataReader, veja que eles herdam do mesmo pai DbDataReader. O mesmo do SQLDatareader e de outros DataReaders.

     


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    terça-feira, 16 de agosto de 2011 15:41
    Moderador
  •  

     

    Oi Olavo,

     

    Entendo, mas neste caso  clientes.ToList(); retornará apenas campos da tabela Cliente , correto?  Se eu precisar dos campos de vendas e clientes no mesmo Grid, como eu deveria fazer?

     

    Existe alguma forma de fazer um "Bind" em um Grid com os dados das duas tabelas unidas ?

     

    Abraço forte,

     

    Edson

     

     


    Gerente de Projetos, Analista Business Intelligence, Integrações ETL, Mapeamento de Processos Organizacionais - BPM Consultant.
    terça-feira, 16 de agosto de 2011 21:27
  • Edson meu amigo, da uma lida nessa thread http://social.msdn.microsoft.com/Forums/pt-BR/aspnetpt/thread/4faef208-e597-4bb5-a4de-5e159b4b745a
    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    quarta-feira, 17 de agosto de 2011 11:25
    Moderador
  • Amigo Edson, boa tarde.

    Se alguma das respostas lhe foi útil, por favor marque como resposta para que outras pessoas também possam se beneficiar da thread :)

     

    Obrigado


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    segunda-feira, 22 de agosto de 2011 15:36
    Moderador