2011-07-06 4 views
1

私は、Contactエンティティと多対多の関係を持つBusinessUnitというエンティティを持っています。EF 4.1コード・ファースト:多対多のトリガー更新

public BusinessUnitConfiguration() 
{ 
    HasMany(c => c.Contacts) 
     .WithMany() 
     .Map(m => 
      { 
       m.ToTable("BusinessUnitContact"); 
       m.MapLeftKey("BusinessUnitId"); 
       m.MapRightKey("ContactId"); 
      }); 

    ToTable("BusinessUnit"); 
} 

public ContactConfiguration() 
{ 
    ToTable("Contact"); 
} 

連絡先エンティティは、親がどのような関係にあるかわかりません。私たちはSilverlight + WCFを使用しているため、遅延読み込みとプロキシの作成は無効になっています。

BusinessUnitインスタンスと0個以上のContactインスタンスで構成されるクライアント上のオブジェクトグラフを作成または変更し、保存するWCFサービスに送信します。ここで新しいコンテキストが作成され、必要に応じて追加/削除されます変更を保存する前に

問題は、既存のビジネスユニットの連絡先コレクションに新しい連絡先を追加すると、EFはジャンクションレコードを挿入しないということです。新しい連絡先を追加することはできますが、ビジネスユニットを連絡先にマップするBusinessUnitContact行。

BusinessUnitのContactsプロパティは、ObservableCollection < Contact>です。親ビジネスユニットが追加されたときに機能しますが、追加されていないときに機能します。

連絡先関連付けをコンテキストに添付するときにEFに変更を通知して、新しいジャンクションレコードを挿入する必要があるようにする方法はありますか?

+0

変更を行うコードを表示する必要があります。 –

答えて

0

問題が見つかりました。 EFコンテキストに親エンティティを結合したコードは、実際に直接装着されなかった - それは元のエンティティをロードし、次いで、取り付けられたエンティティのプロパティにマージ:

// attach entity 
var existing = GetQuery<TEntity>().FirstOrDefault(e => e.Id == entity.Id); 
if (existing == null) 
{ 
    throw new InvalidOperationException("Cannot attach an entity that does not exist in the database."); 
} 

switch (entity.State) 
{ 
    case ObjectState.Modified: 
     GetEntry(existing).CurrentValues.SetValues(entity); 
     break; 

    case ObjectState.Deleted: 
     GetEntry(existing).State = EntityState.Deleted; 
     break; 
} 

これはしていないようナビゲーションプロパティのための仕事は、しかし、私は、次のようにコードを変更:

var set = GetSet<TEntity>(); 
set.Attach(entity); 

// map object state to entity state 
switch (entity.State) 
{ 
    case ObjectState.Modified: 
     GetEntry(entity).State = EntityState.Modified; 
     break; 

    case ObjectState.Deleted: 
     GetEntry(entity).State = EntityState.Deleted; 
     break; 
} 

エンティティが取り付けられていることを確認作っていた変更するために必要なすべてだったに来て実体と同じ - BusinessUnitエンティティはありませんどちらかを変更する必要があります。

関連する問題