我在修改其中一个实体时更新两个实体之间的关系时遇到问题。请注意,我正在使用实体框架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 –