0

2 つのエンティティの 1 つを編集するときに、2 つのエンティティ間の関係を更新する際に問題が発生します。Entity Framework 4.0 を使用していることに注意してください。

非常に基本的に、 aは a (1対多)Categoryに属している必要があります。DepartmentDepartmentCategories

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 フォームは etc を使用してビルドされているTextBoxFor()ため、モデル バインドは問題ありません。これとまったく同じ方法がカテゴリの作成にも使用され、意図したとおりに機能します。

    public JsonResult SaveCategory(Category category)
    {
        try
        {
            category.Save();

            return Json(category.toJson(), JsonRequestBehavior.AllowGet);
        }
        catch (Exception ex)
        {
            return Json("ERROR", JsonRequestBehavior.AllowGet);
        }
    }
4

2 に答える 2

0

db.SaveChanges()エンティティを変更した後に呼び出す必要があります。

于 2013-08-21T12:00:11.190 に答える