none
Usar uma só instância do contexto pra várias classes relacionadas numa aplicação em camadas RRS feed

  • 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

     

     


    quinta-feira, 22 de dezembro de 2011 11:45

Respostas

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
    quinta-feira, 22 de dezembro de 2011 12:06
    Moderador
  • 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

     

    quinta-feira, 22 de dezembro de 2011 12:38
  • 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
    quinta-feira, 22 de dezembro de 2011 12:42
    Moderador
  • 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


    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
    sexta-feira, 23 de dezembro de 2011 13:13
    Moderador
  • Alguma evolução Lion?

     

    []s!
    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    sexta-feira, 13 de janeiro de 2012 11:06
    Moderador