2011-07-06 64 views
1

我有一個實體BusinessUnit,它與Contact實體有多對多的關係。我們使用流利的配置按照下面的示例: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實例和零個或多個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實體不也必須修改。