在不加载实体的情况下更新ASP.NET MVC EF4中的相关实体的最佳实
我已经看到了一些与主题相关的问题,但是找不到这个场景的答案.
我有类似的结构 我控制器的一部分 // // GET: /Person/Edit/5 public ActionResult Edit(int id) { var viewModel = new PersonViewModel(PersonRepository.Get(id)); return View(model); } // // POST: /Person/Edit [AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(PersonViewModel model) { PersonRepository.Update(model.Person,model.Phones); return RedirectToAction("Index"); } 在我的存储库中我做这样的事情: public void Update(Person person,ICollection<Phone> phones) { using (var unitOfWork = UnitOfWork.Current) { Attach(contact); UpdatePhones(contact,phones); unitOfWork.Commit(); } } public Person Attach(Person person) { Context.AttachTo("Persons",entity); Context.ObjectStateManager.ChangeObjectState(entity,EntityState.Modified); return entity; } public void UpdatePhones(Person person,ICollection<Phone> phones) { if (phones == null || phones.Count == 0) return; foreach (var phone in phones.Where(o => o.IsDeleted && !o.IsNew)) { PhoneRepository.Delete(phone); } foreach (var phone in phones.Where(o => !o.IsDeleted && o.IsNew)) { party.Phones.Add(phone); } foreach (var phone in phones.Where(o => !o.IsDeleted && !o.IsNew)) { phone.PartyID = party.ID; PhoneRepository.Attach(phone); } } IsDeleted和IsNew不会持久保存到db中并以动态形式使用. PhonesRepository Attach()是一样的. 我正在做这样的所有更新,因为我需要尽可能减少数据库调用次数.也许这有一个已知的最佳实践? 谢谢=) 解决方法
这一点都不错.与我们的设置非常相似.
几个指针: 1 – 对您的存储库使用泛型.您的Attach代码非常简单,不需要在实体之间重复.如果您创建了GenericRepository< T>,那么您的附加代码将是: public T Attach<T>(T entity) where T : class { Context.GetEntitySet<T>.Attach(entity); // pluralization on (typeof)T.name to get entity set Context.ObjectStateManager.ChangeObjectState(entity,EntityState.Modified); return entity; } 2 – 我会将UpdatePhones方法分成单独的方法.我不会依赖标志(IsDeleted等)来确定行动方案.我会更明确. 3 – 看起来你有一个PhoneRepository?为什么? Person是您的聚合根,并且Phone始终与特定Person相关,因此您应该只在此聚合边界中具有PersonRepository.您应该附加到特定人员的Phones ObjectSet. 顺便说一句 – 我假设您已禁用延迟加载?如果不是,那些通过ICollection的LINQ操作将导致无声往返. 除了以上几点(主要是设计相关的),优化方面你的代码对我来说很好. 最后一点 – 还有另一种推荐技术(Alex James)用于更新称为“stub techinque”的独立上下文(也称为MVC)中的实体. 如果你感兴趣的话,我几天前问了一个问题(并自己解决了),check it out. HTH. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – MVC数据类型货币触发器数字小键盘
- asp.net – 仅为Web服务关闭customErrors
- asp.net-mvc-5 – 使用Hangfire时出现SQL Server错误
- asp.net – ViewState作为属性
- asp.net-mvc – 在IISExpress上通过计算机名访问ASP.net we
- asp.net-mvc – ASP.NET MVC AjaxForm没有正确更新部分视图
- asp.net-mvc – ASP.NET MVC 4 Visual Studio 2010项目模板
- asp.net-mvc-3 – ASP.Net MVC隐藏/显示基于安全性的菜单项
- 在asp.net MVC2中的每个Web请求上创建的nhibernate会话
- asp.net-mvc – ASP.NET MVC自定义错误页面(StatusCode 404