Usuário com melhor resposta
Usar uma só instância do contexto pra várias classes relacionadas numa aplicação em camadas

Pergunta
-
bom dia..
To construindo uma aplicação em 3 camadas(dal, bll, ui). Digamos que estou trabalhando com 2 classes, uma pai e a outra filha,
o problema é que numa mesma operação eu incluo um registro pai e vários filhos, porém pode acontecer de incluir um pai e não incluir os filhos devido algum erro, pois não estão no mesmo contexto, pois na classe pai tem um contexto e na classe filha tem outro contexto.
Dentro do padrão de camadas como eu poderei trabalhar num só contexto para ambas as classes???
Obrigado
- Editado EvangelistaLion quinta-feira, 22 de dezembro de 2011 12:40
Respostas
-
Olá Lion,
Com o EF4.1 fica mais fácil :)
Nesse caso vc pode fazer assim para mudar o status de seus objetos:
seuDataContext.Entry(seuObjeto).State = System.Data.EntityState.Modified;
Veja este exemplo de código, dentro do método Save, esse é o attachment q vc provavelmente precisa: http://ferhenriquef.files.wordpress.com/2011/10/060_thumb.png?w=605&h=1190[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.wordpress.com/
Twitter: @ferhenrique- Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 27 de dezembro de 2011 13:20
- Marcado como Resposta Olavo Oliveira NetoModerator segunda-feira, 16 de janeiro de 2012 11:25
Todas as Respostas
-
Olá Lion,
Não tem como.
Vc precisa adicionar sua classe a seu contexto.
O contexto funciona como um elo e também como um agrupamento entre as classes.
Contextualmente, se vc esta executando uma operação com duas classes, que estão em contextos distintos, existe um erro na lógica de agrupamento de classes de seu contexto. Então, se for o caso, crie um terceiro contexto que englobe estas duas classes.
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.wordpress.com/
Twitter: @ferhenrique -
Olá Fernando,
me expressei mal, nas verdade essas classes estão no mesmo contexto, porém com 2 instâncias deste contexto....
Por exemplo, usando o exemplo do seu blog de carros e montadoras....
Vamos supor que vou incluir uma montadora e vários carros pra esta montadora numa só operação...
Quando eu incluir a montadora, dentro da classe montadora vai ter um savechanges do contexto,
aí depois quando vou incluir os carros vai ter um savechanges....o contexto é o mesmo....mas em instancias diferentes...
como tenho então 2 savechanges pode acontecer de salvar a montadora no banco de dados e não incluir os carros dessa montadora caso aconteça um erro...
Se fosse apenas um savechanges nesta operação, a montadora e nem os carros seriam incluidos no banco dados se houvesse um erro..
O que posso fazer??Obrigado
-
Olá Lion,
Nesse caso é mais simples.
Como estão em contextos distintos, vc precisa "attachar" a instâncias dos objetos no contexto antes de fazer a sua inclusão.
Vc terá de fazr algo do tipo:
using (AdventureWorksEntities context = new AdventureWorksEntities()) { context.SalesOrderDetails.Attach(updatedItem); // Check if the ID is 0, if it is the item is new. // In this case we need to chage the state to Added. if (updatedItem.SalesOrderDetailID == 0) { context.ObjectStateManager.ChangeObjectState(updatedItem, System.Data.EntityState.Added); } else { context.ApplyOriginalValues("SalesOrderDetails", originalItem); } context.SaveChanges(); }
Veja estes links:
http://msdn.microsoft.com/en-us/library/bb896271.aspx
http://msdn.microsoft.com/en-us/library/bb896245.aspx
http://msdn.microsoft.com/en-us/library/bb896248.aspx
http://msdn.microsoft.com/en-us/library/bb738697.aspx
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.wordpress.com/
Twitter: @ferhenrique -
Olá Fernando,
Estou usando EF4.1 e no meu contexto não tem a opção ObjectStateManager
Uma forma que eu pensei que dá certo é na camada UI eu instanciar meu contexto e passar como parametro para as classes na minha camada BLL. assim as classes teriam em comum a mesma instancia do contexto. mas não sei se isso é uma boa prática, se foge do padrão de camadas...?????
Obrigado
- Editado EvangelistaLion sexta-feira, 23 de dezembro de 2011 13:05
-
Olá Lion,
Com o EF4.1 fica mais fácil :)
Nesse caso vc pode fazer assim para mudar o status de seus objetos:
seuDataContext.Entry(seuObjeto).State = System.Data.EntityState.Modified;
Veja este exemplo de código, dentro do método Save, esse é o attachment q vc provavelmente precisa: http://ferhenriquef.files.wordpress.com/2011/10/060_thumb.png?w=605&h=1190[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.wordpress.com/
Twitter: @ferhenrique- Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 27 de dezembro de 2011 13:20
- Marcado como Resposta Olavo Oliveira NetoModerator segunda-feira, 16 de janeiro de 2012 11:25
-
Alguma evolução Lion?
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.wordpress.com/
Twitter: @ferhenrique