2011-01-20 5 views
2

J'utilise d'abord le CTP 5 de EF 4 et le code. Je n'ai pas beaucoup de relations avec une clé composite d'un côté.Code EF Premier mappage de touches composites

modelBuilder.Entity<Item>()     
      .HasMany(i => i.Categories) 
      .WithMany(o => o.Items) 
      .Map(
      mc => 
      {     
       mc.ToTable("ItemCategories"); 
       mc.MapLeftKey(i => i.Id, "ItemId"); 
       mc.MapRightKey(o => o.TemplateID, "TemplateId"); 
       mc.MapRightKey(o => o.ItemId, "ItemId");     
      } 
      ); 

Donc, au lieu d'avoir une simple clé pour les catégories dans ma table correspondante, j'ai un composite. Et une partie de la clé composite est également la clé pour le type d'élément, qui semble être le problème ici. J'ai l'erreur: "Chaque nom de propriété dans un type doit être unique.Nom de propriété 'ItemId' était déjà défini."

Comment puis-je configurer EF pour utiliser une clé composite dans ce cas?

+0

Veuillez montrer votre modèle d'objet. Merci. –

Répondre

2

Bien sûr, vous ne pouvez pas avoir 2 colonnes avec le même nom dans une table. Cela fonctionne:

modelBuilder.Entity<Item>() 
      .HasMany(i => i.Categories) 
      .WithMany(c => c.Items) 
      .Map(m => 
      { 
       m.MapRightKey(i => i.Id, "ItemId"); 
       m.MapLeftKey(c => c.ItemId, "ItemId2"); 
       m.MapLeftKey(c => c.TemplateId, "TemplateId"); 
      }); 
+0

Je vois, mais le MapLeftKey est une clé composite (ItemId + TemplateId), donc l'ItemId est vraiment le même que sur le côté droit. – user250773

+0

Cela n'a pas d'importance parce que Code First ne le sait pas et créera une table de jointure contenant * toutes * les colonnes clés des deux tables. –

+0

Je n'ai pas de colonne ItemId2 dans cette table. Je reçois un {"Nom de colonne invalide 'ItemId2'."} Tout ce que je veux, c'est réutiliser cette même colonne pour une relation de clé composite sur la table de catégories. Est-ce possible? – user250773

0
public class Category 
{    
    [Key]   
    public string ItemId { get; set; } 
    [Key] 
    public string TemplateId { get; set; } 

    public string Value { get; set; } 

    public ICollection<Item> Items { get; set; } 
} 

public class Item 
{  
    public string Id { get; set; }  
    public string Name { get; set; }  

    public ICollection<Category> Categories { get; set; } 
} 

La table de correspondance entre ItemCategories n'est pas un POCO, mais utilisés pour cartographier les 2 comme indiqué . Il a des colonnes SQL Id (propre clé primaire) ItemId (FK à la table d'objet et table Catégorie) templateId (FK à table Catégorie)

et une autre colonne ID qui mappe à une autre table. À mon avis, la seule différence avec le scénario «normal» est la clé composite dans la table ItemCategories, qui crée la relation avec la table Category.