Chave composta com EF 4.1 Code First


105

Estou tentando descobrir como ter uma chave composta usando o código EF First 4.1 RC.

Atualmente, estou usando a anotação de dados [chave], mas não consigo especificar mais de uma chave.

como alguém especificaria uma chave composta?

Aqui está meu exemplo:

 public class ActivityType
{
    [Key]
    public int ActivityID { get; set; }

    [Required(ErrorMessage = "A ActivityName is required")]
    [StringLength(50, ErrorMessage = "Activity Name must not exceed 50 characters")]
    public string ActivityName { get; set; }

}

Preciso que o "ActivityName" também seja uma chave. Claro, posso codificar em torno disso, mas esse não é um bom design de banco de dados.

Respostas:


186

Você pode marcar as propriedades ActivityIDe ActivityNamecomKey anotação ou pode usar a API fluente conforme descrito por @taylonr.

Editar:

Isso deve funcionar - a chave composta definida com anotações requer uma ordem explícita das colunas:

public class ActivityType
{
    [Key, Column(Order = 0)]
    public int ActivityID { get; set; }

    [Key, Column(Order = 1)]
    [Required(ErrorMessage = "A ActivityName is required")]
    [StringLength(50, ErrorMessage = "Activity Name must not exceed 50 characters")]
    public string ActivityName { get; set; }

}

Entendo. Obrigado por me atualizar. Marcado como resposta.
bugnuker

1
Como adicionar restrições / índices únicos que não são realmente chaves?
Shimmy Weitzhandler

105

Não usamos as anotações, em vez disso, substituímos o construtor de modelo, caso em que você pode fazer algo como:

modelBuilder.Entity<Activity>().HasKey(a => new { a.ActivityId, a.ActivityName });

isso funciona, mas espero uma anotação que funcione. Havia amostras com CTP 4, mas eles não funcionam mais no 4.1 RC
bugnuker

3
Sei que você estava procurando anotações, mas achei que isso pudesse ajudar na busca ... como eu disse, não estamos usando anotações, então não
ajudei

14
Eu gosto dessa abordagem. Mantém o modelo limpo de questões de contexto. THX.
ctorx

Alguém sabe se a configuração de chave primária composta usando API fluente funciona para SQL CE? Não funciona para mim (dá um erro de que 'EntityType ... não tem chave definida') e não tenho certeza de criar uma nova pergunta ou não.
Kasitan

Se você simular seu DbContext para fins de teste de unidade, como garantir que o modelBuilder seja executado para definir o relacionamento entre entidades e / ou chaves primárias compostas?
Jim Aho
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.