在ASP.NET MVC中用DDD仓库与工作单元模式更新实体的方案咨询
问题分析与解答
现有方案说明
代码实现
Case caseInRepository = _unitOfWork.CaseRepository.FindById(case.Id); caseInRepository.UpdateState(case); _unitOfWork.CaseRepository.Update(caseInRepository); _unitOfWork.CaseRepository.SaveChanges();
补充:
UpdateState方法负责将传入的编辑后case实例的字段映射到从仓库获取的caseInRepository上,未在视图中设置的null字段会被忽略。
疑问解答
1. 通过FindById获取实例是否正确?
这种方式完全正确,而且是推荐的安全更新模式。从数据库拉取最新的实体实例后再做字段映射,能避免覆盖那些前端没传递、但后端维护的关键字段(比如创建时间、操作人ID等),同时也能更好地处理并发更新的场景,防止脏数据产生。
2. Update方法是否需要保留?
分两种场景判断:
- 仅使用Entity Framework作为数据存储:不需要这行代码。因为
FindById返回的实体处于EF的跟踪状态,当你通过UpdateState修改属性后,EF会自动记录所有变更,调用SaveChanges时就会把这些变更同步到数据库。 - 仓储层做了抽象,需兼容多种数据存储:如果你的系统后续可能切换到不支持自动变更跟踪的存储(比如部分NoSQL数据库、自定义数据访问层),那这行
Update必须保留。它能保证仓储层的更新逻辑统一,不管底层存储是否具备跟踪能力。
总结:
- 若确定长期只用EF,可直接移除这行冗余代码;
- 若要兼容多存储或不确定未来变更,保留这行代码以保证仓储接口的一致性。
内容的提问来源于stack exchange,提问作者GrassConcreteFloor1788
相关产品推荐
相关产品推荐

