在编辑其中一个实体时,我遇到了更新两个实体之间关系的问题。请注意,我正在使用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
字段正确保存了更改后的值。在连接之前,在连接之后,一直通过。但实体框架忽略了这些变化,同时仍然正确地进行标量值调整。
我错过了什么?如果有人能指出我正确的方向?
我尝试过的事情包括:
//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);
}
}
答案 0 :(得分:0)
修改实体后,您必须致电db.SaveChanges()
。
答案 1 :(得分:0)
我设法找到了这个问题。这不是一件容易的事。
我注意到我的大部分关系都为'child'实体创建了一个Scalar值。 (例如Category
shoud已自动收到DepartmentID
标量值。但事实并非如此。
以下是问题:如果您在EF中创建关联,则会出现一个窗口,要求您选择要关联的两个实体。 孩子(类别,一个)需要在正确的字段中,而父母(部门,许多)需要在左侧。 菜单允许您将它们放在任何一侧,没有什么可以阻止您这样做。但只有输入数据一个< - >很多你会得到标量值。不是当你把它像许多< - >一个> ,即使这应该是完全相同的。
我是否正确地说这是一个错误?
我的原始代码段,只有.Attach()
和EntityState.Modified
现在按预期工作。
我只能在2天内将此答案标记为正确,但您可以将此问题视为已关闭。