2013-11-23 81 views
0

我一直試圖解決一個問題的某個時候,似乎無法找到任何工作......LINQ的「添加新」和「刪除舊」對象與實體框架

在我的MVC應用程序,我收到地址對象與逗號分隔的與之相關聯的名稱字符串。 e.g:

public class address 
{ 
    public string Names { get; set; } //-- "Name-One,Name-Two,Name-Three" 
} 

在我的服務層我分裂這個名單成一個字符串數組。

現在使用實體框架,我需要瓶坯三個任務

1)創建要存儲在數據庫中的新名稱的對象,並將它們添加到地址。

2)從數據庫中刪除舊的名稱對象,並從地址中刪除它們。

3)提交更改,以便地址對象鏈接到新的多個名稱對象列表。

有沒有人有任何想法如何可以不擊中數據庫太多。提前(每個循環避免無休止)

感謝

周杰倫

+1

你應該只有一次調用'SaveChanges',所以你的SQL活動應該相對簡單。 –

+0

「parsimonious」+1 – oooyaya

回答

2
string[] newNames = ServiceLayerSplitCommaSeparatedIntoArray(addressObj); 
var entity = dbContext.Set<Address>().Find(addressId); 
entity.Names.Clear(); 
foreach (var newName in newNames) 
    entity.Names.Add(new AddressName { 
     Value = newName, 
    }); 
dbContext.SaveChanges(); 

我認爲最有效的方式做,這是完成你的任務2,然後1,然後3

entity.Names.Clear()行將從地址中刪除所有舊的Name對象。只要這些實體具有地址實體所需的外鍵,它們也將從數據庫中刪除。否則,如果他們有一個可選的外鍵,你可以做到這一點從數據庫(而不是ClearNames集合)將其刪除:

var oldNames = entity.Names.ToArray(); 
foreach (var oldName in oldNames) 
    dbContext.Set<AddressName>().Remove(oldName); 
//entity.Names.Clear(); // Remove calls above will clear these automatically 

然後,您可以遍歷的字符串數組,並添加新的實體到收藏。

最後,保存更改。所有內容都將被刪除並添加到單個數據庫中。

+0

正確,但您還需要在此創建Name對象。 「名稱」屬性是一個字符串。你也可以使用Find(AddressId)方法獲取地址 –