0

假設我在實體類public bool isActive等上有一堆布爾屬性等。將通過在Web應用程序中設置複選框來操作這些值。我只會一次性發回一個更改後的名稱/值對和主鍵,如{ isActive : true , NewsPageID: 34 },默認的模型聯編程序將創建一個只有這兩個屬性設置的NewsPage對象。現在,如果我運行下面的代碼,它不僅會更新已在由模型綁定器創建的NewsPage對象上設置的屬性的值,而且還會嘗試爲現有實體對象清空所有其他非設置值,因爲它們未在由模型聯編程序創建的NewsPage對象上設置。是否可以在不觸及其他實體對象的情況下自動更新所選屬性

是否有可能以某種方式告訴實體框架不要查看設置爲null的屬性,並試圖將這些更改保存回檢索到的實體對象,因此數據庫?也許有一些我可以編寫的代碼只會利用模型聯編程序創建的NewsPage對象上的非空值及其屬性名稱,並且只會嘗試更新這些特定的屬性?

[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 } 
} 
+0

將可能更容易不變的道具傳遞給模型綁定,或者寫一個自定義,並得到完整的對象那裏。 – veblock 2012-07-06 03:49:56

回答

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(); 

    } 
0

你可以去兩個選項

  1. 註冊該行動自定義模型粘合劑。在自定義模型聯編程序中,您必須從數據庫中獲取完整的對象,並僅更新POSTed屬性。

  2. 使用視圖模型。而不是直接將NewsPage模型作爲操作參數。您可以創建包裝必要屬性的自定義視圖模型。在動作中,您必須調用db來獲取完整的NewsPage實例,並僅更新視圖模型中的相應屬性。

+0

模型活頁夾解決方案聽起來是可行的,因爲它只會匹配集合,並且僅匹配模型的名稱/值對,在我的情況下,它可能是數據庫中的完整對象。儘管ViewModel方法並不真正爲處理NewsPage對象帶來任何好處。當然,我可以爲名稱,值和pageid設置一個單獨的屬性,但這也可以從NewsPage對象中提取。 – LaserBeak 2012-07-06 04:39:37

1

API沒有強類型,但您可以按如下所示進行操作。 DbContext API對此有更好的支持。

[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"); 
} 
相關問題