46 votes

Comment mapper une clé primaire composite dans le code premier d'Entity Framework 4 ?

Je me familiarise d'abord avec le code EF4, et je l'apprécie jusqu'à présent. Mais j'ai du mal à faire correspondre une entité à une table avec une clé primaire composite.

La configuration que j'ai essayée ressemble à ceci :

public SubscriptionUserConfiguration()

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

Qui jette cette exception : Unable to infer a key for entity type 'SubscriptionUser'.

Qu'est-ce que je rate ?

74voto

Daniel Skinner Points 999

Vous pouvez également utiliser

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

Edit :

Une limitation que j'ai trouvée est que les éléments suivants ne fonctionnent pas :

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

ou

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

Alors comment configurer une entité où la table de jonction a une clé primaire qui est composée de clés étrangères ?

20voto

sergioacortes Points 91

Je vais essayer de l'expliquer étape par étape, en utilisant l'Entité suivante

public class Account
{
    public int AccountId1 { get; set; }
    public int AccountId2 { get; set; }
    public string Description { get; set; }
}
  1. Créez une classe dérivée de la EntityTypeConfiguaration<TEntity> Objet permettant de remplacer les conventions

    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. Lors de la création de la classe dérivée de la DbContext Objet, surcharge OnModelCreating et ajouter une nouvelle AccountEntityTypeConfiguration aux Configurations du générateur de modèle.

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

J'espère que cela vous aidera !

15voto

Aaron Hoffman Points 2696

Vous pouvez également utiliser le Column attribut

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

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

6voto

jamesfm Points 353

Je l'ai résolu : Je devrais utiliser HasKey, et non Identity. Cela fonctionne :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X