2012-07-03 48 views
2

我正在使用WCF數據服務,它對大多數事情都很好,但我很難弄清楚如何更新具有相關實體集合的實體。例如,在下面的代碼中,我有一個包含相關部門的Batch對象。在我的數據庫中,這表示爲三個表格 - 批次,部門和批次_部門。 EF將此作爲帶有Departments導航屬性的批對象公開給我看。使用WCF數據服務保存對象及其相關對象

在下面列出的代碼中,創建了Batch對象並填充了Departments集合,但是當我調用SaveChanges時,只有Batch對象在數據庫中創建。部門被忽略。如果我在SaveChanges行上設置斷點,我可以驗證Departments集合是否已填充。

private void Save() 
{ 
    var batch = new DataService.Batch() { Description = txtDescription.Text, Filename = txtFilename.Text }; 

    foreach (var department in lstDepartments.CheckedItems) 
    { 
    var dept = _ctx.Departments 
     .Select(d => d) 
     .Where(d => d.DepartmentID == ((DataService.Department)department).DepartmentID) 
     .First(); 

    batch.Departments.Add(dept); 
    } 

    _ctx.AddToBatches(batch); 
    _ctx.SaveChanges(); 
} 

我敢肯定,我失去了一些東西很明顯,但我似乎無法找到它。任何幫助將不勝感激。

回答

1

這是當前生成的代碼的限制。你還需要將下面的代碼行添加到您的程序:

context.AddLink(batch, "Departments", dept); 

您還可以掛接到PropertyChanged事件進行批處理,如果你喜歡。

編輯:我發現了另一個選項。您可以執行以下操作而不是AddLink

private void Save() 
{ 
    var batches = new DataServiceCollection<Batch>(_ctx); 
    var batch = new DataService.Batch() { Description = txtDescription.Text, Filename = txtFilename.Text }; 
    batches.Add(batch); 

    foreach (var department in lstDepartments.CheckedItems) 
    { 
    var dept = _ctx.Departments 
     .Select(d => d) 
     .Where(d => d.DepartmentID == ((DataService.Department)department).DepartmentID) 
     .First(); 

    batch.Departments.Add(dept); 
    } 

    // _ctx.AddToBatches(batch); 
    _ctx.SaveChanges(); 
} 
+0

感謝您的回覆。我早些時候嘗試過,但收到一條消息,說「上下文目前不在跟蹤實體。」由於你的帖子證實這種方法是正確的,我挖了一點,發現我需要在foreach之前移動_ctx.AddToBatchs(batch)。 (我之前認爲它是未被跟蹤的部門對象)。在完成此操作並在foreach主體內添加AddLink行後,它按照我的預期工作。再次感謝。 – DarLom