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.