我有一個編輯ViewModel,可以完成一些數據庫工作。在ViewModel中實例化DbContext VS傳遞控制器的實例
這對我採取的這些方法有什麼影響嗎?
- 通在控制器的的DbContext實例的視圖模型(下面實施例1)
- 創建視圖模型本身內的一個新的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的知識。它是一個'愚蠢的'類,包含您的視圖中使用的屬性(請參閱[什麼是MVC中的ViewModel?](http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc))。你的方法意味着你不能進行單元測試。 –
爲什麼你在模型中有一個'SaveChanges'方法?你從視圖中調用它嗎? –
也許我錯誤地命名了它。這是一個大型數據模型,我只是編輯了幾個屬性。因此,我想要一個模型將這兩個屬性與主數據庫支持的模型隔離開來,並將它們顯示在編輯頁面上。然後發佈我綁定到模型的屬性被編輯並更新數據庫, –