Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Key Column

Minha duvida se baseia em como o Entity Framework acha qual é a keyColumn da entidade, por exemplo:

namespace lojaComEntity.Entidades
{
   public class Venda
    {
        public virtual int ID { get; set; } 

        public virtual Usuario Cliente { get; set; }
        public virtual int ClienteID { get; set; }

        public virtual IList<ProdutoVenda> ProdutoVendas { get; set; }
    }
}

A minha entidade Vendas possui uma key column designada como int ID, porém como o Entity acha qual é a key column? Por que se você observar o código, tem outra variável que é INT (a ClienteID), em suma, para ele localizar a key column ela só precisa ter escrito ID ou é utilizado outro método para a localização da mesma?

4 respostas
solução!

Camila, o padrão é que a EntityFramework procure primeiro por um atributo chamado ID ou Id. Caso não encontre nenhum, vai procurar por um atributo que comece com o nome da classe e termine com Id, ou seja, no exemplo acima seria VendaID ou VendaId. Caso nenhum dos dois exista, é necessário incluir a anotação [Key]:

public class Venda {
    [Key]
    public int MeuId {get; set;}
}

Espero ter conseguido explicar bem!

Outra coisa, reparei que existem erros no seu código: o modificador virtual deve ser usado somente para atributos que são objetos para que a EntityFramework possa utilizar uma estratégia de carregamento diferente. Portanto atributos int não deveriam precisar ser virtuais:

namespace lojaComEntity.Entidades {
    public class Venda {
        public int ID { get; set; } // sem virtual
        public virtual Usuario Cliente { get; set; }
        public int ClienteID { get; set; } // sem virtual
        public virtual IList<ProdutoVenda> ProdutoVendas { get; set; }
    }
}

Ah sim, Muito obrigado, esclareceu minha dúvida, porém fiquei meio confusa em respeito ao uso do virtual, poderia me esclarecer melhor?

Não sou expert, tive que fazer umas pesquisas pra responder à pergunta, então talvez esteja falando besteira

Achei esse post aqui, vou tentar explicar o que entendi:

Quando você insere um objeto virtual como atributo na sua entidade, o EF envelopa este objeto para conseguir manuseá-lo. Isso significa que ele vai conseguir carregar os dados deste objeto a partir de outra tabela somente quando necessário, por exemplo (lazy loading). Isso é necessário quando você está mexendo com relações entre tabelas/entidades, mas não com os campos dela (como os campos de ID ou atributos como nome, quantidade, etc).

A Venda tem um Usuário, que é uma outra entidade. Portanto, o dado que é importante guardar na entidade Venda é o id do usuário. Por isso, cria-se o campo int ClienteId. Já o acesso direto ao objeto do usuário deve ser feito por uma relação virtual, gerenciada pelo próprio EF. Este é o atributo virtual Usuario Cliente.

Deu pra entender?

Camila, lembre-se de marcar a resposta que te ajudou como solução do tópico! Outros com a mesma dúvida vão agradecer no futuro!

Deu pra entender sim, muito obrigado !