1

私の MVC アクション メソッドは、既定のモデル バインダーがフォーム コレクション データから作成するエンティティ オブジェクト (ページ) を受け取ります。一部のフィールドは、リクエストでサーバーに送信されなかったため、間違っているか null です。たとえば、「 」を送信していないためCreateDate、デフォルトのモデル バインダーがこのプロパティを必要のないデフォルト値に設定しています。

オブジェクトがアタッチされると、もちろん、すべての値を永続化しようとします (無効な値や不要な値をデータベースに含めます)。もちろん、プロパティごとに手動で割り当てることもできますが、EntityState が modified に設定され、SaveChanges() が呼び出されたときに永続化されないように、何らかの方法でプロパティにフラグを付けることができるかどうか疑問に思っていました..

public ActionResult SomeMethod(Page page)
{
page.ModifyDate = DateTime.Now;

       _db.NewsPages.Attach(page);
                _db.ObjectStateManager.ChangeObjectState(page, System.Data.EntityState.Modified);
                _db.SaveChanges();
                _db.Dispose();

}
4

1 に答える 1

0

これを処理する正しい方法は、ビュー モデルに別のクラスを使用し、空のエンティティをコンテキストにアタッチし、プロパティごとに実際の値を割り当てる (または AutoMapper にこのシナリオを処理させる) ことです。@Darin はコメントで提案しています。

思い通りに進みたい場合は、POCO エンティティの状態を変更してはいけませんが、変更されたすべてのプロパティの状態を変更する必要があります。

public ActionResult SomeMethod(Page page)
{
    page.ModifyDate = DateTime.Now;

    _db.NewsPages.Attach(page);
    ObjectStateEntry entry = _db.ObjectStateManager.GetObjectStateEntry(page);
    entry.SetModifiedProperty("ChangedPropertyName");
    // Do the same for all other changed properties
    _db.SaveChanges();
    _db.Dispose();
}
于 2012-07-09T08:26:35.757 に答える