Usuário com melhor resposta
Regras de negocio e EntityFramework

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
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
- Marcado como Resposta Kelvin Cleto Gonçalves quinta-feira, 22 de novembro de 2012 12:35
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
-
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
- Marcado como Resposta Kelvin Cleto Gonçalves quinta-feira, 22 de novembro de 2012 12:35