Bre*_*ogt 1 entity-framework entity-framework-4 entity-framework-4.1 asp.net-mvc-3
我正在使用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
}
}
Run Code Online (Sandbox Code Playgroud)
我的存储库类:
public class TutorialRepository : ITutorialRepository
{
PbeContext db = new PbeContext();
public void Add(Tutorial tutorial)
{
db.Tutorials.Add(tutorial);
}
public void Save()
{
db.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
控制器类:
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());
}
Run Code Online (Sandbox Code Playgroud)
更新代码会是什么样的?有更简单的方法吗?
在您的存储库中:
public void UpdateScalar(Tutorial tutorial)
{
var original = db.Tutorials.Find(tutorial.ID);
db.Entry(original).CurrentValues.SetValues(tutorial);
}
Run Code Online (Sandbox Code Playgroud)
然后在您的服务中:
public void Update(Tutorial tutorial)
{
tutorialRepository.UpdateScalar(tutorial);
tutorialRepository.Save();
}
Run Code Online (Sandbox Code Playgroud)
Tigger的解决方案也有效,并且具有在更新之前无需加载原件的好处.另一方面,将状态设置为Modified强制所有属性都在UPDATE语句中发送到DB,无论它们是否更改.上面的解决方案只将更改的属性发送到数据库,但需要先加载原始数据.
两种解决方案仅适用于标量属性.一旦涉及更复杂的对象图和导航属性,更新就变得更加复杂.
| 归档时间: |
|
| 查看次数: |
5624 次 |
| 最近记录: |