0

エンティティ クラスpublic bool isActiveなどに多数のブール型プロパティがあるとします。値は、Web アプリケーションでチェック ボックスを設定することによって操作されます。たとえば、一度に 1 つの変更された名前と値のペアと主キー { isActive : true , NewsPageID: 34 }のみをポストバックし、既定のモデル バインダーは、これら 2 つのプロパティ セットのみを使用して NewsPage オブジェクトを作成します。ここで、以下のコードを実行すると、モデル バインダーによって作成された NewsPage オブジェクトに設定されたプロパティの値が更新されるだけでなく、もちろん、既存のエンティティ オブジェクトに設定されていない他のすべての値を null にしようとします。モデル バインダーによって作成された NewsPage オブジェクトには設定されません。

エンティティ フレームワークに、null に設定されているプロパティを調べないように指示し、それらの変更を取得したエンティティ オブジェクト、つまりデータベースに保持しようとすることは可能ですか? おそらく、モデル バインダーによって作成された NewsPage オブジェクトの null 以外の値とそのプロパティ名のみを利用し、それらの特定のプロパティのみを更新しようとするコードを書くことができますか?

    [HttpPost]
    public PartialViewResult SaveNews(NewsPage Np)
    {
        Np.ModifyDate = DateTime.Now;
        _db.NewsPages.Attach(Np);
        _db.ObjectStateManager.ChangeObjectState(Np, System.Data.EntityState.Modified);
        _db.SaveChanges();
        _db.Dispose();


        return PartialView("MonthNewsData");
    }

もちろん、以下のようなこともできますが、最適な解決策ではないと感じています。特に、設定する必要がある 6 つのブール値プロパティがあることを考えると。

[HttpPost]
public PartialViewResult SaveNews(int NewsPageID, bool isActive, bool isOnFrontPage)
{
        if (isActive != null)   { //Get entity and update this property }
        if (isOnFontPage != null) { //Get entity and update this property }
}
4

3 に答える 3

1

API は強く型付けされていませんが、次のようにできます。DbContextAPI はこれをより適切にサポートしています。

[HttpPost]
public PartialViewResult SaveNews(NewsPage Np)
{
    Np.ModifyDate = DateTime.Now;
    _db.NewsPages.Attach(Np);
    var entry = _db.ObjectStateManager.GetObjectStateEntry(Np);

    var cv = entry.CurrentValues;

    if (isActive)
    {
        cv.SetBoolean(cv.GetOrdinal("isActive"), true);
    }

    _db.SaveChanges();
    _db.Dispose();

    return PartialView("MonthNewsData");
}
于 2012-07-06T03:59:32.470 に答える
0

あなたは2つのオプションに行くことができます

  1. そのアクションのカスタム モデル バインダーを登録します。カスタム モデル バインダーでは、データベースから完全なオブジェクトを取得し、POST されたプロパティのみを更新する必要があります。

  2. ビュー モデルを使用します。NewsPageモデルをアクション パラメーターとして直接持つ代わりに。必要なプロパティをラップするカスタム ビュー モデルを作成できます。アクション内で db を呼び出して完全なNewsPageインスタンスを取得し、ビュー モデルから対応するプロパティのみを更新する必要があります。

于 2012-07-06T03:58:14.453 に答える
0

やや醜いですが、カスタムモデルバインダーを作成して登録したり、複数の if ステートメントを使用したりすることなく、私の場合はうまくいきました。

    [HttpPost]
    public void SaveNews(string propname, bool propvalue, int PageID)
    {
        var prop = typeof(NewsPage).GetProperties().FirstOrDefault(x => x.Name.ToLower() == propname.ToLower());
        var Np = _db.NewsPages.FirstOrDefault(x => x.PageID == PageID);
        prop.SetValue(Np, propvalue, null);

         Np.ModifyDate = DateTime.Now;
        _db.SaveChanges();
        _db.Dispose();

    }
于 2012-07-06T05:27:20.790 に答える