在编辑其中一个实体时,我在更新两个实体之间的关系时遇到问题。请注意,我使用的是 Entity Framework 4.0。
基本上, aCategory
需要属于 a 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);
}
}
创建对象没有问题,只有当我尝试保存已编辑的项目时才会出现问题(因此问题出在if (this.id > 0)
块内)。
我知道EntityState.Modified
这只适用于标量值。上面的代码片段是一个稍旧的版本。我已经尝试以多种方式修复它,但这些都没有解决问题。
我在 Stackoverflow 上找到了许多解决方案,但都没有奏效。请参阅下面的我之前尝试的片段。
我检查了调试中的值,当前项目Department
和DepartmentID
字段正确地保存了更改的值。附前,附后,一直到。但是 Entity Framework 忽略了这些更改,同时仍然正确地进行了标量值调整。
我错过了什么?如果有人能指出我正确的方向吗?
我尝试过的事情包括:
//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()
是调用该方法的方式。请注意,实际的 Web 表单是使用TextBoxFor()
etc. 构建的,因此模型绑定是可以的。这种完全相同的方法也用于创建类别,它确实按预期工作。
public JsonResult SaveCategory(Category category)
{
try
{
category.Save();
return Json(category.toJson(), JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
return Json("ERROR", JsonRequestBehavior.AllowGet);
}
}