我正在使用Entity Framework 4.1 Code First和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());
}
更新代码会是什么样的?有没有更简单的方法呢?
答案 0 :(得分:5)
在您的存储库中:
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,但需要在之前加载原始文件。
两种解决方案仅适用于标量属性。一旦涉及更复杂的对象图和导航属性,更新就会变得更加复杂。
答案 1 :(得分:4)
您可以在存储库类中对插入和更新使用相同的save方法,例如
public void Save(Tutorial tutorial)
{
db.Entry(tutorial).State = tutorial.Id == 0
? EntityState.Added
: EntityState.Modified;
db.SaveChanges();
}