我在修改其中一個實體時更新兩個實體之間的關係時遇到問題。請注意,我正在使用實體框架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上找到了很多解決方案,但都沒有工作。請參閱以下我以前嘗試的片段。
我檢查了調試中的值,當前項目的Department
和DepartmentID
字段正確保存更改的值。在附着之前,在附着之後,一路通過。但實體框架忽略了這些更改,同時仍然正確地執行標量值調整。
我錯過了什麼?如果有人能指出我正確的方向?
我嘗試的東西還包括:
//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);
}
}
請您分享調用Save()方法的代碼嗎? –
它只不過是模型綁定(通過MVC),然後調用Save()。但爲了清晰起見,我會添加它。更新:我添加了它。 – Flater
他們這樣做的方式有時可能會很棘手,看看這是否有助於你:http://stackoverflow.com/questions/15177372/entity-framework-modify-detached-object –