2011-04-18 81 views
1

我有一些像下面的代碼。這可行,但我認爲它不夠清楚,需要我編寫冗長的代碼(手動分配每個屬性)。如何在EF中正確更新模型實體實例?

// POST: /TableA/Edit 
[HttpPost] 
public ActionResult Edit(TableA formdata) 
{ 
    TableA temp = myDB.TableA.First(a=>a.Id == formdata.Id); 

    //A foreign key model in another TableB 
    var tbb = myDB.TableB.First(a => a.Id == formdata.TableB.Id); 
    temp.TableB = tbb; 

    //fields in this table 
    temp.field1= formdata.field1; 
    temp.field2= formdata.field2; 
    temp.field3= formdata.field3; 

    myDB.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

我能有類似的一些代碼,對象初始化:

TableA temp = myDB.TableA.First(a=>a.Id == formdata.Id) 
    { 
     TableB = myDB.TableB.First(a => a.Id == formdata.TableB.Id), 
     field1= formdata.field1, 
     field2= formdata.field2, 
     field3= formdata.field3, 
    } 

    myDB.SaveChanges(); 
    return RedirectToAction("Index"); 
+0

什麼是你想怎麼辦? – hunter 2011-04-18 12:41:00

+0

我認爲第一個解決方案很難看。我可以有一些更有意義的更新模型的方法嗎? – hbrls 2011-04-18 12:43:10

+0

第二個解決方案沒有任何意義。當你不調用構造函數時,你不能使用對象初始值設定項。第一個解決方案不是很難看...... – hunter 2011-04-18 12:48:47

回答

1

使用即AutoMapper,你可以把它寫這樣的(可能必須設置到對象之間的映射限制在您想複製的屬性):

[HttpPost] 
public ActionResult Edit(TableA formdata) 
{ 
    TableA temp = myDB.TableA.First(a=>a.Id == formdata.Id); 
    temp.TableB = myDB.TableB.First(a => a.Id == formdata.TableB.Id); 

    AutoMapper.Mapper.Map(formdata, temp); 
    myDB.SaveChanges(); 
    return RedirectToAction("Index"); 
} 
+0

是...對象映射可能是他可以用來刪除可重複代碼的東西。另一件事是擴展方法(或公共方法),因爲實體類是部分類,所以他可以添加他需要的任何功能。 – 2011-04-18 13:05:47

+0

不期待,但真的是魔術! – hbrls 2011-04-18 13:20:06

+0

@羅伯特Koritnik部分類聽起來像我在找什麼。如果項目進度允許,我會嘗試。 – hbrls 2011-04-18 13:22:09

1

你可以使用TryUpdateModel方法

更新使用來自控制器的當前值提供程序的值指定的模型實例和包括的屬性。

[HttpPost] 
public ActionResult Edit(TableA formdata) 
{ 
    if (ModelState.IsValid) 
    { 
     TableA temp = myDB.TableA.First(a=>a.Id == formdata.Id); 
     if (TryUpdateModel<TableA>(temp)) 
     { 
      myDB.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
    } 

    return View(); 
} 

你會好起來呼籲Controller.TryUpdateModel Method (TModel, String[])防止你不希望從它的帳前被添加到窗體可編輯屬性。這包括您不希望表單發佈的ID或其他字段。

+0

+1與UpdateModel映射建立比外部解決方案更好,如果它是足夠的。 – BrokenGlass 2011-04-18 13:17:57

+0

UpdateModel給我帶來了很多麻煩。這就是我反覆編寫'temp.field1 = formdata.field1;'的原因。我是EF新手,所以很難調試。但是,謝謝你。 – hbrls 2011-04-18 13:24:44

相關問題