2011-01-20 18 views
2

私はEF 4とコードのCTP 5をまず使用しています。 私は、片面にコンポジットキーを使って作業する多数のリレーションシップを取得しません。EFコード最初のコンポジットキーマッピング

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

私の一致するテーブルのカテゴリのための単純なキーの代わりに、私は複合型を持っています。コンポジットキーの1つの部分は、項目タイプのキーでもあり、ここでは問題と思われる があります。

「タイプの各プロパティ名は一意でなければなりません。プロパティ名「ItemId」はすでに定義されています。」

この場合、複合キーを使用するようにEFを設定するにはどうすればよいですか?

+0

オブジェクトモデルを表示してください。ありがとう。 –

答えて

2

もちろん、1つのテーブル内に同じ名前の列を2つ持つことはできません。これは動作します:

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

私は知っているが、MapLeftKeyは複合キー(ItemId + TemplateId)なので、ItemIdは本当に右側と同じです。 – user250773

+0

これは重要ではありません。なぜなら、Code Firstはそれを知らず、両方のテーブルの*すべての*キー列を含む結合テーブルを作成するからです。 –

+0

私はそのテーブルにItemId2列を持っていません。 {"Invalid column name 'ItemId2'。}}カテゴリテーブルの複合キーリレーションに同じ列を再利用するだけです。それは可能ですか? – 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; } 
} 

マッピングテーブルItemCategoriesがPOCOではなく、示されたもの2 としてマッピングするために使用されます。 それは(カテゴリテーブルにFK)SQLカラム ID(自分の主キー)(項目テーブルとカテゴリテーブルにFK) のItemId れるtemplateIdを持って

と別のテーブルにマップする別のID列。

ここでの「通常の」多数のシナリオとの唯一の違いは、ItemCategoriesテーブルの複合キー で、カテゴリテーブルとの関係が構築されている点です。

関連する問題