2010-04-28 19 views
42

Me estoy familiarizando con el código EF4 primero, y me gusta hasta ahora. Pero estoy teniendo problemas para asignar una entidad a una tabla con una clave primaria compuesta.¿Cómo mapeo primero una clave primaria compuesta en el código de Entity Framework 4?

La configuración que he intentado es así:

public SubscriptionUserConfiguration() 

    { 
       Property(u => u.SubscriptionID).IsIdentity(); 
       Property(u => u.UserName).IsIdentity(); 
    } 

que arroja esta excepción: No es posible deducir una clave para el tipo de entidad SubscriptionUser '.

¿Qué me estoy perdiendo?

Respuesta

68

También es posible usar

HasKey(u => new { u.SubscriptionID, u.UserName }); 

Editar:

Una limitación que he encontrado es que los siguientes no funcionan:

public ProjectAssignmentConfiguration() 
{ 
    HasKey(u => u.Employee.EmployeeId); 
    HasKey(u => u.Project.ProjectId); 
} 

o

public ProjectAssignmentConfiguration() 
{ 
    HasKey(u => new { u.Employee.EmployeeId, u.Project.ProjectId }); 
} 

Entonces, ¿cómo se configura una entidad donde la tabla de unión tiene una clave primaria que se compone de claves externas?

+2

Acabo de tener este mismo problema, mis síntomas fueron que devolvía la cantidad correcta de entidades pero todas las entidades que tenían la misma primera clave regresaron con los contenidos de datos del primer registro, ignorando el segundo. También parecía hacer cosas graciosas con mis insertos y conectar los datos de otros registros que ya estaban en la base de datos. – zclark

5

Resuelto: Debería usar HasKey, no Identity. Esto funciona:

public SubscriptionUserConfiguration() 
{ 
    HasKey(u => u.SubscriptionID); 
    HasKey(u => u.UserName); 
} 
+0

o tal vez es necesario el uso de la forma sugerida por Daniel? http://stackoverflow.com/questions/3299268/entity-framework-ctp4-and-composite-keys Supongo que a usted le funcionó bien. –

19

Voy a tratar de explicar paso a paso, utilizando la siguiente Entidad

public class Account 
{ 
    public int AccountId1 { get; set; } 
    public int AccountId2 { get; set; } 
    public string Description { get; set; } 
} 
  1. Crear una clase derivada de la EntityTypeConfiguaration<TEntity> objeto de anular las convenciones

    class AccountEntityTypeConfiguration : EntityTypeConfiguration<Account> 
    { 
    
        public AccountEntityTypeConfiguration() 
        { 
         // The Key 
         // The description of the HasKey Method says 
         // A lambda expression representing the property to be used as the primary key. 
         // If the primary key is made up of multiple properties then specify an anonymous type including the properties. 
         // Example C#: k => new { k.Id1, k.Id2 } 
         // Example VB: Function(k) New From { k.Id1, k.Id2 } 
         this.HasKey(k => new { k.AccountId1, k.AccountId2 }); // The Key 
    
         // Maybe the key properties are not sequenced and you want to override the conventions 
         this.Property(p => p.AccountId1).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None); 
         this.Property(p => p.AccountId2).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None); 
    
         this.Property(p => p.Description).IsRequired(); // This property will be required 
         this.ToTable("Account"); // Map the entity to the table Account on the database 
        } 
    } 
    
  2. Al crear la clase derivada del objeto DbContext, reemplaza el método OnModelCreating y agrega un nuevo objeto AccountEntityTypeConfiguration a la Conf. iguraciones del modelo Builder.

    public class MyModelAccount : DbContext 
    { 
        public DbSet<Account> Accounts { get; set;} 
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder) 
        { 
         // Add a new AccountEntityTypeConfiguration object to the configuration of the model, that will be applied once the model is created. 
         modelBuilder.Configurations.Add(new AccountEntityTypeConfiguration()); 
        } 
    
    } 
    

Espero que te ayude!

13

También puede utilizar el atributo Column

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

    [Key, Column(Order = 1)] 
    public int RoleId { get; set; } 
} 
+2

solo un aviso para aquellos que buscan - ColumnAttribute requiere .NET 4.5 – zomf

Cuestiones relacionadas