我使用的是实体框架4.1代码优先和ASP.NET MVC 3。
我有一个服务类,在这个类中我调用我的存储库方法。
我添加了一个新的教程对象来工作,我只是不知道如何更新记录。以下是我的插入和更新服务方法:
public class TutorialService : ITutorialService
{
private ITutorialRepository tutorialRepository;
public TutorialService(ITutorialRepository tutorialRepository)
{
this.tutorialRepository = tutorialRepository;
}
public void Insert(Tutorial tutorial)
{
tutorialRepository.Add(tutorial);
tutorialRepository.Save();
}
public void Update(Tutorial tutorial)
{
// Not sure what the code looks like here to call the repo methods
}
}
我的存储库类:
public class TutorialRepository : ITutorialRepository
{
PbeContext db = new PbeContext();
public void Add(Tutorial tutorial)
{
db.Tutorials.Add(tutorial);
}
public void Save()
{
db.SaveChanges();
}
}
控制器类别:
public ActionResult Edit(EditTutorialViewModel editTutorialViewModel)
{
// Other code
if (!ModelState.IsValid)
{
return View("Edit", editTutorialViewModel);
}
// Mapping code here to Tutorial object
Tutorial tutorial = (Tutorial)tutorialMapper.Map(editTutorialViewModel, typeof(EditTutorialViewModel), typeof(Tutorial));
// Update the existing tutorial
tutorialService.Update(tutorial);
return RedirectToRoute(Url.TutorialList());
}
更新代码会是什么样子?有没有更简单的方法?
在您的存储库中:
public void UpdateScalar(Tutorial tutorial)
{
var original = db.Tutorials.Find(tutorial.ID);
db.Entry(original).CurrentValues.SetValues(tutorial);
}
然后为您服务:
public void Update(Tutorial tutorial)
{
tutorialRepository.UpdateScalar(tutorial);
tutorialRepository.Save();
}
Tigger的解决方案也很有效,其优点是在更新之前无需加载原始版本。另一方面,将状态设置为Modified
会强制在UPDATE语句中将所有属性发送到DB,无论它们是否更改。上面的解决方案只将更改后的属性发送到DB,但需要在之前加载原始属性。
两种解决方案都只能使用标量属性。一旦涉及到更复杂的对象图和导航属性,更新就会变得更加复杂。
您可以在存储库类中对插入和更新使用相同的保存方法,例如
public void Save(Tutorial tutorial)
{
db.Entry(tutorial).State = tutorial.Id == 0
? EntityState.Added
: EntityState.Modified;
db.SaveChanges();
}