编辑两个实体时,我在更新两个实体之间的关系时遇到问题。请注意,我正在使用Entity Framework 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);
}
}
创建对象的过程没有问题,只有当我尝试保存已编辑的项目时,才会发生问题(因此,问题位于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()
等构建的,因此可以进行模型绑定。此完全相同的方法也用于创建类别,该类别确实可以正常工作。
public JsonResult SaveCategory(Category category)
{
try
{
category.Save();
return Json(category.toJson(), JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
return Json("ERROR", JsonRequestBehavior.AllowGet);
}
}
修改实体后,您必须致电db.SaveChanges()
。
我设法找到了问题。这不是一件容易的事。
[我注意到我的大多数关系都为'子'实体创建了标量值。 (例如Category
应该自动接收了DepartmentID
标量值)。但是事实并非如此。
这里是问题:如果您在EF中创建关联,则会出现一个窗口,要求您选择要关联的两个实体。 子(类别,一个)必须在右侧,而父(部门,许多)必须在左侧。菜单允许您将它们放置在任何一侧,没有什么可以阻止您这样做。但是,只有输入数据one many,您才会获得添加的标量值。当您像many one>这样放置时,即使那在字面上是同一件事,也不是。
我是否正确地说这是一个错误?
我的原始代码段现在仅按预期运行.Attach()
和EntityState.Modified
。
我只能在2天内将此答案标记为正确,但是您可以将此问题视为已关闭。