2013-07-09 39 views
4

如何刪除實體框架5中聯結表中的記錄?刪除實體框架中的聯結表記錄代碼優先(M:M)

當對我的DataContext進行逆向工程時,實體框架似乎識別了我的交接表並自動將集合添加到我的模型以表示M:M關係。添加項目時這很棒,因爲我可以簡單地構建我的整個實體,並且所有內容都可以正確插入。完善。

但是,我很難去除關係。例如,一個活動可以具有與其相關聯的多個聯繫人,這是使用一個結合表(dbo.ActivityContacts)連接,其由列:

  • ActivityID
  • 的ContactID

兩個我的活動和聯繫人模型已由EF與Collections更新以代表其他人。例如,我的活動模式是這樣的:

public class Activity 
    { 
     public int ActivityID { get; set; } 
     public string Subject { get; set; } 
     public virtual ICollection<Contacts> Contacts { get; set; } 
    } 

在非EF環境,我會簡單地從路口表中刪除記錄,並與我的一天前進。但是,似乎我無法直接使用EF訪問交匯表,所以我對如何刪除記錄(關係)感到困惑。

如何從Entity Framework的聯結表中正確刪除記錄?

回答

1

同意@Chris。

另一種解決方案是要做到:

context.Entry(activity).State = EntityState.Deleted; 
2

如果您從關係的任一側刪除關聯的對象,實體框架應該爲您刪除記錄。

假設你從上下文中獲取此Activity實例,並希望刪除特定Contact與已知ID:

unwantedContact = context.Contacts.Find(contactID); 
myActivity.Contacts.Remove(unwantedContact); 

context.SaveChanges(); 

應該刪除您的結表中的記錄,除非我是愚蠢。

0
contact_to_delete = context.Contacts.Find(contactID); 
selected_activity = context.Activity.Find(ActivityID); 
context.Entry(selected_activity).Collection("Activity").Load(); 
selected_activity.Contacts.Remove(contact_to_delete); 
db.SaveChanges(); 
+2

你應該詳細說明你的答案,只是發佈代碼是不好的禮儀。 –

1

阿里golshani的工作做得很好,提供的解決方案。讓我試着再擴展一下。在我的情況下,我有一個每個項目都帶有嵌入式複選框的列表框。我希望能夠添加/刪除選中的項目。

下面的'dto'對象是從客戶端發送的。它正在檢查列表中每個項目的選定狀態。如果有人知道有什麼方法可以改善這一點,請留下反饋。

file_appender selectedAppender = context.file_appender.Find(dto.Id); 

int[] ids = dto.Loggers.Where(x => !x.Selected).Select(x => x.Id).ToArray(); 
var loggers_to_delete = selectedAppender.logger.Where(x => ids.Contains(x.id)); 
loggers_to_delete.ToList().ForEach(x => 
{ 
    selectedAppender.logger.Remove(x); 
}); 

ids = dto.Loggers.Where(x => x.Selected).Select(x => x.Id).ToArray(); 
var loggers_to_add = context.logger.Where(x => ids.Contains(x.id)); 
loggers_to_add.ToList().ForEach(x => 
{ 
    selectedAppender.logger.Add(x); 
});