繁体   English   中英

实体框架 - 关系未更新

[英]Entity framework - Relation not updating

在编辑其中一个实体时,我在更新两个实体之间的关系时遇到问题。 请注意,我使用的是实体框架 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字段正确保存了更改后的值。 贴前,贴后,一路走过去。 但是实体框架忽略了这些更改,同时仍然正确地进行了标量值调整。

我错过了什么? 如果有人能指出我正确的方向吗?

我尝试的事情包括:

//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 中创建关联,您会看到一个窗口,要求您选择要关联的两个实体。 孩子(类别,一)需要在正确的领域,而父母(部门,许多)需要在左边。 菜单允许您将它们放在两侧,没有什么可以阻止您这样做。 但只有当您输入一个 <-> 多个数据时,您才会获得添加的标量值。 不是当你把它像many <-> one> 一样时,即使这应该是同一个东西。

我说这是一个错误是否正确?

我原来的片段,它只执行.Attach()EntityState.Modified现在按预期工作。

我只能在 2 天内将此答案标记为正确,但您可以认为此问题已结束。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM