0

我在修改其中一個實體時更新兩個實體之間的關係時遇到問題。請注意,我正在使用實體框架4.0。實體框架 - 不更新的關係

非常基本上,Category需要屬於一個Department(一個Department對許多Categories)。

我實現直接下到Category模式:

public void Save() 
{ 
    using (var db = new MyDatabase()) 
    { 
     if (this.id > 0) 
     { 
      db.Categories.Attach(this); 
      db.ObjectStateManager.ChangeObjectState(this, EntityState.Modified); 
     } 
     else 
     { 
      db.Categories.AddObject(this); 
     } 

     db.SaveChanges(); 
    } 
} 

public int DepartmentID 
{ 
    get 
    { 
     if (this.DepartmentReference.EntityKey == null) return 0; 
     else return (int)this.DepartmentReference 
      .EntityKey.EntityKeyValues[0].Value; 
    } 
    set 
    { 
     this.DepartmentReference.EntityKey 
      = new EntityKey("MyDatabase.Departments", "Id", value); 
    } 
} 

創建對象的工作沒有問題,這是ONY當我嘗試保存時發生的問題進行修改的項目(所以問題在於該if (this.id > 0)內塊)。

我知道EntityState.Modified只適用於標量值。上面的代碼片段是稍舊的版本。我已經嘗試過以多種方式解決這個問題,但沒有一個解決了這個問題。

我在Stackoverflow上找到了很多解決方案,但都沒有工作。請參閱以下我以前嘗試的片段。

我檢查了調試中的值,當前項目的DepartmentDepartmentID字段正確保存更改的值。在附着之前,在附着之後,一路通過。但實體框架忽略了這些更改,同時仍然正確地執行標量值調整。

我錯過了什麼?如果有人能指出我正確的方向?

我嘗試的東西還包括:

//First try 
if (this.id > 0) 
{ 
    var department = db.Departments.Single(x => x.Id == this.DepartmentID); 

    db.Categories.Attach(this); 

    this.Department = department; 

    db.ObjectStateManager.ChangeObjectState(this, EntityState.Modified); 
} 

//Second try 
if (this.id > 0) 
{ 
    db.Categories.Attach(this); 
    db.Departments.Attach(this.Department); 

    db.ObjectStateManager.ChangeObjectState(this, EntityState.Modified); 
} 

//Third try 
if (this.id > 0) 
{ 
    var department = db.Departments.Single(x => x.Id == this.DepartmentID); 

    db.Categories.Attach(this); 

    this.DepartmentID = department.Id; 

    db.ObjectStateManager.ChangeObjectState(this, EntityState.Modified); 
} 

//Fourth try 
if (this.id > 0) 
{ 
    var departmentID = this.DepartmentID; 

    db.Categories.Attach(this); 

    this.Department = db.Departments.Single(x => x.Id == departmentID); 

    db.ObjectStateManager.ChangeObjectState(this, EntityState.Modified); 
} 

更新

按照要求,這裏是如何的.Save()方法被調用。請注意,實際的網頁表格已經使用TextBoxFor()等構建,因此模型綁定沒問題。這種完全相同的方法也用於類別的創建,這些類別按預期工作。

public JsonResult SaveCategory(Category category) 
    { 
     try 
     { 
      category.Save(); 

      return Json(category.toJson(), JsonRequestBehavior.AllowGet); 
     } 
     catch (Exception ex) 
     { 
      return Json("ERROR", JsonRequestBehavior.AllowGet); 
     } 
    } 
+1

請您分享調用Save()方法的代碼嗎? –

+0

它只不過是模型綁定(通過MVC),然後調用Save()。但爲了清晰起見,我會添加它。更新:我添加了它。 – Flater

+0

他們這樣做的方式有時可能會很棘手,看看這是否有助於你:http://stackoverflow.com/questions/15177372/entity-framework-modify-detached-object –

回答

0

我設法找到問題。這不是一件容易的事。

我注意到我的大多數關係都爲'child'實體創建了一個Scalar值。 (例如,Category應該自動收到標量值DepartmentID)。但事實並非如此。

以下是問題:如果您在EF中創建關聯,則會出現一個窗口,要求您選擇要關聯哪兩個實體。 孩子(類別,一)需要在正確的領域,而家長(部門,很多)需要在左邊。 菜單可以讓你把它們放在任何一邊,沒有什麼能阻止你這樣做。但是隻有當你輸入數據一個< - >許多你會得到標量值。不是當你把它像很多< - >一個>即使這應該是字面上相同的事情。

我說得對,這是一個錯誤嗎?

我的原始片段,只有.Attach()EntityState.Modified現在按預期工作。

我只能在2天內將此答案標記爲正確,但您可以將此問題視爲已關閉。

0

您必須在修改實體後調用db.SaveChanges()

+0

它在那裏,但只在'if else'塊之後。我沒有將它包含在塊中,因爲無論是否創建或更新,都需要調用它。 – Flater

+0

您可以添加部門和類別模式嗎? –

+0

它們是由實體框架創建的,我使用的是模型的第一種方法('從模型生成數據庫')。您看到的片段是我爲擴展實體而創建的部分「類別」類的一部分。除了我所添加的東西外,其他都是由EF生成的它是什麼syou特別想知道的實體? **編輯:**這不是一個獨特的問題。數據模型中的所有類似關係都有相同的問題。我假設EF有一些功能我沒有正確使用,因爲我基本上使用了相同的Save函數。 – Flater