2013-03-07 13 views
8

をレコードを追加)CustomerInGroups(CustomerId、GroupId)Entity Frameworkは、私は3つのテーブルを持っている多くのマッピングテーブルに多くに</p> <p>1)お客様(ID、名前、BLAのBLA)</p> <p>2)CustomerGroups(グループID、GroupNameの)</p> <p>3を

using (var context = DataObjectFactory.CreateContext()) 
{     
    context.Customers.Add(entity); 
    context.SaveChanges(); 
    return entity.Id; 
} 

CustomerInGroupsにレコードを追加するにはどうすればよいですか? EntityFrameworkは、このような多対多マッピングテーブル

のためのエンティティを生成しません

編集:

両方のIdお客様の列とCustomerGroupsオートインクリメントに設定されています。

は、だから私のCustomersGroupテーブルで、私は

Id   Name 
---------------------------- 
1   Normal 
2   VIP 

を持っていたポスターの一つが示唆したように私はこれをやってみました:

entity.CustomerGroups = new List<CustomerGroup> 
{ 
    new CustomerGroup {Id = 2 } 
}; 
context.Customers.Add(entity); 
context.SaveChanges(); 
return entity.Id; 

をしかし、私はこれをしなかったとき、代わりにレコードを作成します

CustomerId   GroupId 
---------------------------- 
1     2 

私が入手したものは

でしたあなたは entityが持っているどのような特性を含んでいなかったので、
CustomerInGroups 
    CustomerId   GroupId 
    ---------------------------- 
    1     3 

CustomerGroups 
    Id   Name 
    ---------------------------- 
    1   Normal 
    2   VIP 
    3   NULL 

は、それは実際に私は少しブラインドフライング

+1

顧客をグループに割り当てるとき、またはその逆のときにエンティティフレームワークが自動的に結合テーブルを更新しないのですか?結合にペイロードがない場合(つまり、外部キーのみの結合)、別のエンティティを作成する必要はありません。 – Daniel

答えて

7

を望むものではありません私のCustomerGroupsテーブル内の別のエントリを作成しました。しかし、関係のプロパティはCustomerGroupsにする必要があります。関連したいグループでそのプロパティを設定するだけです。たとえば、これは新しいグループ名 "foo bar"を作成し、そのグループにエンティティを関連付けます。

using (var context = DataObjectFactory.CreateContext()) 
{ 
    entity.CustomerGroups = new List<CustomerGroup> { GroupName = "Foo bar" }; 
    context.Customers.Add(entity); 
    context.SaveChanges(); 
    return entity.Id; 
} 

関係が正しく設定されている場合、EFは自動的にCustomerGroupsにレコードを挿入し、CustomerInGroupsテーブルに関係を挿入します。

EDIT:

あなたは新しいお客様に既存のCustomerGroupを追加しようとしている場合。最初にCustomerGroupをデータベースから取得し、挿入しているCustomerエンティティに追加することをお勧めします。

using (var context = DataObjectFactory.CreateContext()) 
{ 
    var customerGroups = context.CustomerGroups.Where(...).ToList(); // get your CustomerGroup object(s) here, and ensure it's enumerated with ToList() 
    entity.CustomerGroups = customerGroups; 
    context.Customers.Add(entity); 
    context.SaveChanges(); 
    return entity.Id; 
} 
+0

これは私のためには機能しませんでした。それは私のグループテーブルの別のレコードを作成しました –

+0

@PapyrusBit 'CustomerGroup'がすでに作成できるように私の答えを編集しました。したがって、顧客からの既存の 'CustomerGroup'に関連付けることができます。 –

+0

@StevenV第2のエンティティが存在するときにあなたがしていることに従っていても、まだ新しいレコードが作成されています:( – Ciwan

2

あなたは_existingグループに既存顧客をASSINGとCustomerGroupオブジェクトがICollectionをを公開することを前提にしようとしている場合は、次のようにします。

(var context = DataObjectFactory.CreateContext()) 
{ 
    context.Customers.Add(entity); 
    var group = context.CustomerGroups.Find(2); // or however you retrieve the existing group 
    group.Customers.Add(entity); 
    context.SaveChanges(); 
    return entity.Id 
} 

検索()メソッドは、Entity Frameworkのですコードファースト(DbContext)のIDでの検索方法。私は私の頭の上に "正しい" ObjectContextの方法を覚えていませんが、.Single(g => g.Id == 2)も機能します。

あなたがあなたのエンティティをどのように関連付けているかわかるように、エンティティがどのようにマッピングされているかをわかりやすくお伝えください。

+0

私は上記のことをすべてやっていますが、まだデータベースに新しいレコードを作成しています!私は、既存のレコードを使用して関係を形成するように言っていますが新しいエンティティと新しいレコードの間に@ – Ciwan

+0

@Ciwanあなたは新しい質問を投稿しましたか?あなたのコメントに基づいて答えるのは難しいですガイドとして、既存のエンティティをEFコンテキストコレクションに戻さないようにしてください。 – Daniel

1

@ Steven-vの回答に加えて、以前にカスタマーグループを取得していて、dbから再度フェッチしたくない場合は、コンテキストに追加することもできます。

関連する問題

 関連する問題