实体框架-关系未更新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架-关系未更新相关的知识,希望对你有一定的参考价值。

编辑两个实体时,我在更新两个实体之间的关系时遇到问题。请注意,我正在使用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上找到了许多解决方案,但是没有一个起作用。有关我以前尝试的摘要,请参见下文。

我在调试中检查了值,当前项的DepartmentDepartmentID字段正确保存了更改后的值。在安装之前,安装之后,一直进行到整个过程。但是,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天内将此答案标记为正确,但是您可以将此问题视为已关闭。

以上是关于实体框架-关系未更新的主要内容,如果未能解决你的问题,请参考以下文章

实体框架模型中的集合未更新

实体框架数据未使用 Wcf 服务保存或更新

使用实体框架核心模型时 WPF 数据网格未更新

无法获取要更新实体框架中导航属性的关系

为啥实体框架 6 中仍未实现 ON DELETE SET NULL?有障碍吗?

使用 MagicalRecord 插入后 CoreData 关系未更新