【发布时间】:2015-12-06 20:59:52
【问题描述】:
我有一个编辑 ViewModel 可以完成一些数据库工作。
我采用哪种方法有什么不同吗?
- 将控制器的 DBContext 实例传递给 ViewModel(下面的示例 1)
- 在 ViewModel 本身内创建一个新的 DBContext 实例(下面的示例 2)
如果我传入控制器的 DBContext 实例,这意味着 .Dispose() 将在某个时候被调用(假设控制器中有 .Dispose() 方法)。通过在 ViewModel 方法本身内创建 DBContext 实例,这永远不会发生。这有关系吗?
示例 1:
public class ModelOne
{
public int ID { get; set; }
public string PropA { get; set; }
public string PropB { get; set; }
public string PropC { get; set; }
// etc...
}
public class EditModelOnePropAViewModel
{
public EditModelOnePropAViewModel(ApplicationDbContext db, int id)
{
ID = id;
PropA = db.ModelOneDbSet
.Where(i => i.ID == id)
.Select(i => i.PropA)
.FirstOrDefault();
}
public void SaveChanges(ApplicationDbContext db)
{
var modelOne = db.ModelOneDbSet.FirstOrDefault(i => i.ID == ID);
modelOne.PropA = PropA;
db.SaveChanges();
}
public string PropA { get; set; }
public int ID { get; set; }
}
public class ControllerOne : Controller
{
private ApplicationDbContext DB = new ApplicationDbContext() { };
[HttpGet]
public ActionResult Edit(int id)
{
var viewModel = new EditModelOnePropAViewModel(DB, id);
return View(viewModel);
}
[HttpPost]
public ActionResult Edit(EditModelOnePropAViewModel postedModel)
{
if (ModelState.IsValid)
{
postedModel.SaveChanges(DB);
return RedirectToAction("index");
}
return View(postedModel);
}
}
示例 2:
public class ModelTwo
{
public int ID { get; set; }
public string PropA { get; set; }
public string PropB { get; set; }
public string PropC { get; set; }
// etc...
}
public class EditModelTwoPropAViewModel
{
public EditModelTwoPropAViewModel(int id)
{
using (var db = new ApplicationDbContext())
{
ID = id;
PropA = db.ModelTwoDbSet
.Where(i => i.ID == id)
.Select(i => i.PropA)
.FirstOrDefault();
}
}
public void SaveChanges()
{
using (var db = new ApplicationDbContext())
{
var modelTwo = db.ModelTwoDbSet.FirstOrDefault(i => i.ID == ID);
modelTwo.PropA = PropA;
db.SaveChanges();
}
}
public string PropA { get; set; }
public int ID { get; set; }
}
public class ControllerTwo : Controller
{
[HttpGet]
public ActionResult Edit(int id)
{
var viewModel = new EditModelTwoPropAViewModel(id);
return View(viewModel);
}
[HttpPost]
public ActionResult Edit(EditModelTwoPropAViewModel postedModel)
{
if (ModelState.IsValid)
{
postedModel.SaveChanges();
return RedirectToAction("index");
}
return View(postedModel);
}
}
【问题讨论】:
-
视图模型不应该对您的 DBContext 有任何了解。它是一个包含视图中使用的属性的“哑”类(请参阅What is ViewModel in MVC?)。您的方法意味着您不能进行单元测试。
-
为什么Model中有
SaveChanges方法?你是从视图中调用它吗? -
可能是我命名错误。这是一个大型数据模型,我只是在编辑几个属性。因此,我想要一个模型将这两个属性与主数据库支持的模型隔离开来,并将它们显示在编辑页面上。然后在发布时,我使用正在编辑的属性绑定到模型并更新数据库,
标签: asp.net-mvc entity-framework viewmodel dbcontext