2017-07-28 1 views
0

Utilisation du code D'abord, j'ai créé un modèle représentant un Donor. J'ai utilisé une migration pour générer une table pour stocker tous les objets Donor. J'ai utilisé des annotations pour spécifier la clé primaire pour être un composite de deux propriétés de mon modèle, Name et TeamId.Entity Framework Code Première utilisation de clé étrangère dans le cadre de la clé primaire composite

J'ai ajouté une propriété de navigation au modèle appelé HourlySnapshots qui est un ICollection<HourlySnapshot> représentant une relation un-à-plusieurs. (HourlySnapshot est un autre modèle de domaine que j'ai créé.) J'ai exécuté la migration et généré une autre table pour stocker tous les objets HourlySnapshot. Comme prévu, il a ajouté deux colonnes qui n'étaient pas dans mon modèle pour stocker la clé étrangère composée de Name et TeamId.

Pour initialiser la table HourlySnapshots, j'inclus une propriété Id classique dans l'objet HourlySnapshot à utiliser comme clé primaire. Ce que j'essaie de faire est de passer la clé primaire de la table HourlySnapshots de la colonne Id à un composite de la clé étrangère (qui est un composite de Name et TeamId) et une autre propriété de HourlySnapshot appelée Timestamp. En d'autres termes, en faire un composite de trois colonnes Name, TeamId, et Timestamp. Pouvez-vous imaginer un moyen de le faire avec Code First? Je peux facilement le faire en ouvrant la définition et l'édition de la table, mais je voudrais adhérer au flux de travail Code First, de sorte que les migrations incluent tous les changements.

+0

Si vous incluez votre code de modèle, il est plus facile pour les gens de vous aider. Deuxièmement, les [clefs de substitution] (https://en.wikipedia.org/wiki/Surrogate_key) rendent cela beaucoup plus facile. Mais si vous voulez des clés naturelles, vous pouvez spécifier des clés composites dans EF via [annotations] (https://msdn.microsoft.com/fr-fr/library/jj591583 (v = vs.113) .aspx) ou [couramment] (https://msdn.microsoft.com/en-us/library/jj591617(v=vs.113).aspx). –

Répondre

0

Après quelques recherches supplémentaires, j'ai été en mesure d'accomplir cela avec l'API Fluent. Je ne pense pas que ce soit possible en utilisant des annotations ou des conventions. Voici ce que j'ai fini avec dans ma classe ApplicationDBContext ...

public DbSet<Donor> Donors { get; set; } 
public DbSet<HourlySnapshot> HourlySnapshots { get; set; } 
public DbSet<DailySnapshot> DailySnapshots { get; set; } 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Donor>() 
     .HasKey(d => new { d.Name, d.TeamId }); 

    modelBuilder.Entity<HourlySnapshot>() 
     .HasKey(s => new { s.Name, s.TeamId, s.Timestamp }); 

    modelBuilder.Entity<Donor>() 
     .HasMany(d => d.HourlySnapshots) 
     .WithOptional() 
     .HasForeignKey(s => new { s.Name, s.TeamId }); 

    modelBuilder.Entity<DailySnapshot>() 
     .HasKey(s => new { s.Name, s.TeamId, s.TimeStamp }); 

    modelBuilder.Entity<Donor>() 
     .HasMany(d => d.DailySnapshots) 
     .WithOptional() 
     .HasForeignKey(s => new { s.Name, s.TeamId }); 

    base.OnModelCreating(modelBuilder); 
}