none
Como obter o nome das colunas que compõem o EntityKey? RRS feed

  • Pergunta

  • Olá pessoal,

    Preciso de algo relativamente simples, mas acabei esbarrando em um detalhe...

    Preciso pegar o nome das colunas que compõem o EntityKey de uma entidade, e com o trecho abaixo estava até conseguindo, mas quando se trata de um novo registro, o EntityKey ainda não existe e o EntityKeyValues vem como null, e me impede de obter o nome das colunas que são chaves.

    Alguma forma de conseguir isso para novos registros!?

    var oc = ((IObjectContextAdapter)this).ObjectContext;
    
    // Pega a lista de propriedades que são PK.
    propriedadesPK = oc.ObjectStateManager.GetObjectStateEntry(dbEntry.Entity).EntityKey.EntityKeyValues.ToDictionary(p => p.Key, p => p.Value).Keys.ToList();

    abraços!


    Luiz Fernando Bueno

    sexta-feira, 9 de agosto de 2013 20:55

Respostas

  • Olá,

    Veja se isso ajuda:

    private string[] GetKeyNames(DbContext context)
    {
                ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext;
                ObjectSet<TEntity> set = objectContext.CreateObjectSet<TEntity>();
                IEnumerable<string> keyNames = set.EntitySet.ElementType
                                                            .KeyMembers
                                                            .Select(k => k.Name);
    
                return keyNames.ToArray();
    }

    []s!


    MSc. Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Visual C#
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    • Marcado como Resposta Luiz Bueno terça-feira, 1 de outubro de 2013 16:57
    terça-feira, 1 de outubro de 2013 16:03
    Moderador

Todas as Respostas

  • E ai Luiz, 

    Cara se tratando de uma Key gerada automaticamente  creio que não será possível que você recupere essa Key, já que a mesma ainda nem foi gerada. 

    O que eu faria nesse caso, seria recuperar a Key anterior e somar mais 1 a ela já que o banco sempre gera essa key de forma sequencial. 

    Espero ter ajudado. 

    Abras

    sábado, 10 de agosto de 2013 00:09
  • Opa!! Fala Fernando...

    Então, na verdade só preciso da Key porque achei só esse meio de obter o nome das colunas que são PKs na entidade... O que preciso na verdade, é o nome das colunas que compõem a chave primária...

    Conhece um jeito de eu conseguir isso? 

    Abraço!!


    Luiz Fernando Bueno

    sábado, 10 de agosto de 2013 00:20
  • Fala ai. 

    Cara achei um post que o cara estava com o mesmo problema seu rs. 

    HTTP://SOCIAL.MSDN.MICROSOFT.COM/FORUMS/EN-US/D9116085-765C-4ED7-A47E-D0C7E1983803/HOW-TO-GET-COLUMN-NAMES-IN-ENTITY-FRAMEWORK

    Acho que vai te ajudar. 

    Desculpe por eu não ter testado estou sem o VS :(

    Abras.

    sábado, 10 de agosto de 2013 00:45
  • Então... Isso me ajudaria se desse pra eu saber qual das propriedades listadas são chave na entidade... Mas não achei essa possibilidade por esse caminho do GetProperties()... Parece muito simples, mas não acho solução... =/

    Luiz Fernando Bueno

    sábado, 10 de agosto de 2013 01:05
  • Olá,

    Veja se isso ajuda:

    private string[] GetKeyNames(DbContext context)
    {
                ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext;
                ObjectSet<TEntity> set = objectContext.CreateObjectSet<TEntity>();
                IEnumerable<string> keyNames = set.EntitySet.ElementType
                                                            .KeyMembers
                                                            .Select(k => k.Name);
    
                return keyNames.ToArray();
    }

    []s!


    MSc. Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Visual C#
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    • Marcado como Resposta Luiz Bueno terça-feira, 1 de outubro de 2013 16:57
    terça-feira, 1 de outubro de 2013 16:03
    Moderador
  • Olá Fernando,

    Estava usando essa solução mesmo... Acabei encontrando em algum outro site e esqueci de postar aqui.

    Muito obrigado pela ajuda!!

    Abraço!!


    Luiz Fernando Bueno

    terça-feira, 1 de outubro de 2013 16:59