簡體   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