2 つのエンティティの 1 つを編集するときに、2 つのエンティティ間の関係を更新する際に問題が発生します。Entity Framework 4.0 を使用していることに注意してください。
非常に基本的に、 aは a (1対多)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
フィールドは変更された値を正しく保持しています。付ける前、付けた後、ずっと。しかし、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);
}
}