none
Regras de negocio e EntityFramework RRS feed

  • Pergunta

  • Olá senhores, bom dia!

    Desenvolvi um projeto para aprender a usar o Entity Framework

    No projeto eu usei o EF + Repository + POCO + IoC com Ninject , está bem didático e simples de entender, segue URL para download abaixo.

    http://www.4shared.com/rar/vZ5z35Rc/Framework.html 

    Tive muitas duvidas mas todas até agora foram sanadas, porem ontem tentando criar uma regra de negocio para inserir algo no banco, me deparei com um problema. "Óó, é algo terrível - Nhonho /Chaves " rsrs

    Tenho uma tabela principal chamada "PESSOA_BASE" onde fica todas as informações sobre as Pessoas do sistema em comum, tenho mais duas tabelas que dependem da pessoa base, uma chamada "PESSOA_EMPRESA" que complementa a "PESSOA_BASE" para empresas e também a "PESSOA_TAXISTA" que complementa as informações da "PESSOA_BASE" para taxistas.

    No c#, a minha POCO(DTO) PESSOA_BASE, tem a propriedade do tipo PESSOA_TAXISTA e PESSOA_EMPRESA pois a PESSOA_BASE pode ser uma das 2 e nunca as 2 ao mesmo tempo.

    Bom, vamos as duvidas:

    1º - Eu criei 3 repository, um para cada classe, porem no repository "PessoaBaseRepository" no método de inserir, se eu der um "New" no objeto TAXISTA ou EMPRESA na classe "PESSOA_BASE" ele vai inserir na tabela ;)  Isso está correto? Tem como deixar isso para ser feito apenas pelo repository "PessoaTaxistaRepository" ou "PessoaEmpresaRepository" mesmo dando o "New" ?  Quero fazer isso porque cada coisa tem regras especificas antes de ser inserida.

    EX - Eu vou cadastrar um taxista no meu sistema, então eu instancio um objeto PESSOA_BASE e preencho as informações sobre essa pessoa, dou um "new" no objeto "PESSOA_TAXISTA" que fica dentro da "PESSOA_BASE" e preencho as informações do taxista, Quando eu chamar a camada de negocio para fazer a inserção, eu tenho que instanciar os repositórios que vão tratar de inserir esses objetos.....

    O que eu gostaria é que, o meu repositório de pessoa só persisti-se a tabela "PESSOA_BASE" e o repositório de "PESSOA_TAXISTA" só persisti-se a tabela "PESSOA_TAXISTA". Porem como o meu repositorioPessoa recebe uma "PESSOA_BASE" e a pessoa_base contem uma "PESSOA_TAXISTA" ele ja insere em tudo e não aplica a regra de negocio necessária.

    Conseguiram entender a "MUTRETA"? kkkk

    Alguém pode me ajudar com isso?  O código está acima para analisarem.

    Muito Obrigado a todos que responderem! =D

    quinta-feira, 6 de setembro de 2012 11:55

Respostas

  • Olá senhores!  Após muito tempo voltei para responder minha própria duvida.

    A resposta e solução é muito simples, vamos la:

    - O EF identifica cada novo objeto como um novo registro no banco de dados, então se eu der um NEW em algum objeto, mesmo que o mesmo esteja dentro de outro , ele está entendendo como se fosse um novo registro no banco de dados.

    - No caso citado acima o que foi feito é o seguinte, foi criada uma entidade Abstrata chamada Pessoa_base e foi criada mais 2 entidades chamadas Taxista e Empresa. A Taxista e Empresa herdam de Pessoa_base, porem em cada uma delas contem as particularidades. O nome disso é TPH(Table per Hierarchy) 

    Caso queiram saber mais sobre isso, acessem esse link, foi aqui que aprendi a resolver o meu problema: http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx

    quinta-feira, 22 de novembro de 2012 12:34

Todas as Respostas

  • Olá Kelvin,

    Como você está criando e trabalhando manualmente com este objeto, você também deverá controlar o "EntityState" das entidades relacionadas marcando estas outras entidades como "inalteradas" se for necessário. Por exemplo:

    seuContext.ObjectStateManager.ChangeObjectState(pessoaBase.PESSOA_TAXISTA, EntityState.Unchanged); 

    Alterando o estado de PESSOA_TAXISTA neste caso você teria o comportamento esperado.

    Pensando no grau de abstração que a camada de negócio precisará possuir, isso poderá aumentar o acoplamento da sua solução dependendo da forma de como for implementado. Uma outra opção é utilizar o "Attach" antes de começar a trabalhar com o objeto e deixar o EF entender o ciclo de vida do objeto, mas de qualquer forma, dê uma olhada nesta documentação:

    http://msdn.microsoft.com/en-us/library/bb896271.aspx
    http://msdn.microsoft.com/en-us/library/system.data.objects.objectstatemanager.aspx


    Abs!


    @PedroSavelis

    • Sugerido como Resposta Pedro Savelis terça-feira, 11 de setembro de 2012 00:41
    sexta-feira, 7 de setembro de 2012 22:29
  • Olá senhores!  Após muito tempo voltei para responder minha própria duvida.

    A resposta e solução é muito simples, vamos la:

    - O EF identifica cada novo objeto como um novo registro no banco de dados, então se eu der um NEW em algum objeto, mesmo que o mesmo esteja dentro de outro , ele está entendendo como se fosse um novo registro no banco de dados.

    - No caso citado acima o que foi feito é o seguinte, foi criada uma entidade Abstrata chamada Pessoa_base e foi criada mais 2 entidades chamadas Taxista e Empresa. A Taxista e Empresa herdam de Pessoa_base, porem em cada uma delas contem as particularidades. O nome disso é TPH(Table per Hierarchy) 

    Caso queiram saber mais sobre isso, acessem esse link, foi aqui que aprendi a resolver o meu problema: http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx

    quinta-feira, 22 de novembro de 2012 12:34