Comment puis-je mapper une clé primaire composite dans le code Entity Framework 4 en premier?
-
02-10-2019 - |
Question
Je suis prise en main avec le code EF4 premier, et jusqu'à présent goût. Mais je vais avoir du mal à la cartographie d'une entité à une table avec une clé primaire composite.
La configuration que j'ai essayé ressemble à ceci:
public SubscriptionUserConfiguration()
{
Property(u => u.SubscriptionID).IsIdentity();
Property(u => u.UserName).IsIdentity();
}
Ce qui jette cette exception: Impossible de déduire une clé pour le type d'entité « SubscriptionUser ».
Qu'est-ce que je manque?
La solution
Vous pouvez également utiliser
HasKey(u => new { u.SubscriptionID, u.UserName });
Edit:
Une limitation que j'ai trouvé 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 avez-vous mis en place une entité dans laquelle la table de jointure a une clé primaire qui se compose de clés étrangères?
Autres conseils
Je vais essayer de l'expliquer étape par étape, avec l'entité suivante
public class Account
{
public int AccountId1 { get; set; }
public int AccountId2 { get; set; }
public string Description { get; set; }
}
-
Créer une classe dérivée de l'objet
EntityTypeConfiguaration<TEntity>
pour remplacer les conventionsclass 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 } }
-
Lorsque créer la classe dérivée de l'objet
DbContext
, overrideOnModelCreating
Méthode et ajouter un nouvel objetAccountEntityTypeConfiguration
aux configurations du modèle 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()); } }
Hope il vous aide!
Vous pouvez également utiliser l'attribut Column
public class UserProfileRole
{
[Key, Column(Order = 0)]
public int UserId { get; set; }
[Key, Column(Order = 1)]
public int RoleId { get; set; }
}
a résolu le problème: Je devrais utiliser Haskey, pas d'identité. Cela fonctionne:
public SubscriptionUserConfiguration()
{
HasKey(u => u.SubscriptionID);
HasKey(u => u.UserName);
}