none
Update em tabela n para n com entity framework RRS feed

  • Pergunta

  • como posso dar um update em uma tabela que "não tem" id?

     

    pois o id serão os ids de relacionamento.

     

    alguém pode me informar?

     

    estou fazendo assim atualmente:

    try

                {

                    if (entity.EntityKey == null)

                        entity.EntityKey = context.CreateEntityKey(Entity, entity);

                    if (entity.EntityState == System.Data.EntityState.Detached)

                        context.Attach(entity);

                    var statyEntry = context.ObjectStateManager.GetObjectStateEntry(entity.EntityKey);

                    var property = statyEntry.CurrentValues.DataRecordInfo.FieldMetadata.Select(s => s.FieldType.Name);

     

                    foreach (var item in property)

                    {

                        statyEntry.SetModifiedProperty(item);

                    }

                    context.SaveChanges();

                }

                catch (Exception ex)

                {

                    throw new Exception("Erro ao alterar: " + ex.Message + " Favor procurar o administrador.");

                } 

     

     

    mas não funciona com n para n

     


    Att, Hugo S. Mendes
    quarta-feira, 13 de julho de 2011 18:13

Respostas

  • Pessoal. Resolvi!!!

    Achei a resposta em um blog. O stackOverflow (Sei nem se posso citar outros blogs aqui)

     

     

    public static void ApplyDetachedPropertyChanges<T>(this ObjectContext db, T entity)
     where T : EntityObject
     {
      var entitySetName = db.DefaultContainerName + "." + entity.GetType().Name;
    
      T newEntity = Activator.CreateInstance<T>();
      newEntity.EntityKey = db.CreateEntityKey(entitySetName, entity);
    
      Type t = typeof(T);
      foreach(EntityKeyMember keyMember in newEntity.EntityKey.EntityKeyValues) {
       PropertyInfo p = t.GetProperty(keyMember.Key);
       p.SetValue(newEntity, keyMember.Value, null);
      }
    
      db.Attach(newEntity);
      //db.AcceptAllChanges();
    
      db.ApplyPropertyChanges(entitySetName, entity);
     }

     

     

    Esse método de extensão salvou minha vida.

     

    Créditos ao autor dele:  karsu


    Att, Hugo S. Mendes

    • Marcado como Resposta Hugo S. Mendes quinta-feira, 14 de julho de 2011 12:19
    • Editado Hugo S. Mendes quinta-feira, 14 de julho de 2011 12:26 Autor errado.
    quinta-feira, 14 de julho de 2011 12:19

Todas as Respostas

  • Amigo, a tabela de N...N somente guarda as chaves que coopoem o relacionamento entre as duas tabelas, você deseja modificar um desses IDS e não ta conseguindo ?
    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    quinta-feira, 14 de julho de 2011 11:05
    Moderador
  • Bom dia, Olavo.

     

    É o seguinte.

    Em algumas situações a tabela de N..N  tem também atributos.

     

    por exemplo:

     

    Produto --  ItensProduto  -- Cliente

     

    a tabela ItensProduto teria alguns atributos, como: dataCompra, ou algo do tipo.

     

    essa minha tabela também tem.

     

    ou seja, o entity gerou uma referência pra ela, assim como nas demais tabelas.

     

    então eu preciso alterar esse atributo.

    mas ele dá erro.

     

    =/


    Att, Hugo S. Mendes
    quinta-feira, 14 de julho de 2011 11:11
  • qual erro ?
    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    quinta-feira, 14 de julho de 2011 11:22
    Moderador
  • The supplied EntityKey does not have a corresponding entry in the ObjectStateManager.

     

    e quando eu depuro, eu vejo lá que as entityKey's estão certas.


    Att, Hugo S. Mendes
    quinta-feira, 14 de julho de 2011 11:24
  • Pessoal. Resolvi!!!

    Achei a resposta em um blog. O stackOverflow (Sei nem se posso citar outros blogs aqui)

     

     

    public static void ApplyDetachedPropertyChanges<T>(this ObjectContext db, T entity)
     where T : EntityObject
     {
      var entitySetName = db.DefaultContainerName + "." + entity.GetType().Name;
    
      T newEntity = Activator.CreateInstance<T>();
      newEntity.EntityKey = db.CreateEntityKey(entitySetName, entity);
    
      Type t = typeof(T);
      foreach(EntityKeyMember keyMember in newEntity.EntityKey.EntityKeyValues) {
       PropertyInfo p = t.GetProperty(keyMember.Key);
       p.SetValue(newEntity, keyMember.Value, null);
      }
    
      db.Attach(newEntity);
      //db.AcceptAllChanges();
    
      db.ApplyPropertyChanges(entitySetName, entity);
     }

     

     

    Esse método de extensão salvou minha vida.

     

    Créditos ao autor dele:  karsu


    Att, Hugo S. Mendes

    • Marcado como Resposta Hugo S. Mendes quinta-feira, 14 de julho de 2011 12:19
    • Editado Hugo S. Mendes quinta-feira, 14 de julho de 2011 12:26 Autor errado.
    quinta-feira, 14 de julho de 2011 12:19