MVC批量编辑 – Linq到Sql列表保存

为了了解使用MVC和Linq to SQL的一些基础知识,我正在努力改编Stephen Walther的TaskList应用程序 :

我正在使用Steve Sanderson博客中描述的概念添加批量编辑系统。

这一切都按预期工作,但是,我在保存返回的任务列表时遇到问题。 发布到我的BulkEdit循环返回列表并更新我的LinqToSql db任务列表中的每个项目。

我的BulkEdit视图inheritance了ViewPage<List> ,如下所示:

  

TaskEditor控件inheritanceSystem.Web.Mvc.ViewUserControl ,如下所示:

 
Description: Date: Completed:

Controller Get和Post方法如下:

  [AcceptVerbs(HttpVerbs.Get)] public ActionResult BulkEdit() { var tasks = from t in db.Tasks orderby t.EntryDate descending select t; return View(tasks.ToList()); } [AcceptVerbs(HttpVerbs.Post)] public ActionResult BulkEdit(IList tasks) { foreach(Task task in tasks) { foreach(Task dbTask in db.Tasks) { if (dbTask.Id == task.Id) { dbTask.TaskDescription = task.TaskDescription; dbTask.EntryDate = task.EntryDate; dbTask.IsCompleted = task.IsCompleted; } } } db.SubmitChanges(); return RedirectToAction("Index"); } 

我的问题是,这似乎太复杂了,我还没有考虑从列表中添加或删除的任务。 我更喜欢做的事情

 db.Tasks = tasks; 

并让Linq尽一切努力来解决哪些已经改变以及哪些是新的/旧的。

这可能吗? 或者我很快就会期待Linq有点过分了?

您正在处理LINQ to SQL没有多层故事的事实。 我认为这就是你要找的东西:

http://blog.irm.se/blogs/eric/archive/2008/08/20/Go-Distributed-With-LINQ-to-SQL.aspx

这个人提出的Merge方法可以很容易地变成DataContext类的“扩展方法”,它几乎就像是在LINQ to SQL中构建的。 我说几乎是因为你必须包含你的扩展方法所在的命名空间才能使用它。

我认为你应该考虑使用一个视图来实现你想要的。 用于保存项目的ObservebleCollection集合,然后您可以在列表中绑定到该集合的视图,您仍然需要处理添加和删除项目的情况,但您也可以选择一个IBindingList来为您提供一个将更新数据库的BindingListCollectionView,您需要做的就是调用视图AddNew()CommitNew()等等。

HTH,Eric