2011-04-18 58 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

相关问题