Clave compuesta con código EF 4.1 primero

105

Estoy tratando de averiguar cómo tener una clave compuesta usando el código EF First 4.1 RC.

Actualmente, estoy usando la Anotación de datos [Clave], pero no puedo especificar más de una clave.

¿Cómo se especificaría una clave compuesta?

Aquí está mi ejemplo:

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

}

Necesito que "ActivityName" también sea una clave. Claro, puedo codificar esto, pero ese no es un buen diseño de base de datos.

bugnuker
fuente

Respuestas:

186

Puede marcar las propiedades ActivityIDy ActivityNamecon una Keyanotación o puede usar una API fluida como lo describe @taylonr.

Editar:

Esto debería funcionar: la clave compuesta definida con anotaciones requiere un orden de columna explícito:

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
fuente
Veo. Gracias por actualizarme. Marcado como respuesta.
bugnuker
1
De todos modos, ¿agregar restricciones / índices únicos que no son realmente claves?
Shimmy Weitzhandler
105

No usamos las anotaciones, sino que anulamos el generador de modelos, en cuyo caso puede hacer algo como:

modelBuilder.Entity<Activity>().HasKey(a => new { a.ActivityId, a.ActivityName });
Taylonr
fuente
esto funciona, pero espero una anotación que funcione. Hubo muestras con CTP 4, pero ya no funcionan en 4.1 RC
bugnuker
3
Sé que estaba buscando anotaciones, pero pensé que esto podría ayudar en la búsqueda ... como dije, no estamos usando anotaciones, así que no fui de mucha ayuda allí ... espero que encuentre la respuesta
taylonr
14
Me gusta este enfoque. Mantiene el modelo limpio de preocupaciones de contexto. Gracias.
ctorx
¿Alguien sabe si la configuración de la clave primaria compuesta usando una api fluida funciona para SQL CE? No funciona para mí (da un error de que 'EntityType ... no tiene una clave definida') y no estoy seguro de crear una nueva pregunta o no.
kasitan
Si se burla de su DbContext con fines de prueba unitaria, ¿cómo se asegura de que se ejecute modelBuilder para definir la relación entre entidades y / o claves primarias compuestas?
Jim Aho