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.

bugnuker
fonte

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; }

}
Ladislav Mrnka
fonte
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 });
Taylor
fonte
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