asp.net-mvc – 存储库模式:好还是坏?
在阅读了ASP.NET MVC 3.0项目中的存储库设计模式的好处(并使用)后,我遇到了一个令我困惑的问题,并开始质疑该模式的好处.也许有人可以帮我澄清一下.
我有以下3个表格: > – 用户(父母) 粗略地说,表格及其关系的设计如下: >用户[Id] 我有一个BaseRepository,它包含基本的CRUD方法. 有了这个,我还有一个服务层,可以在需要时调用适当的存储库. 简而言之,应用程序显示UserLead并允许用户向UserLead添加/删除注释(在UserLeadNotes表中存储/删除).添加/删除注释是通过Ajax调用完成的.删除笔记沿着我想要删除的笔记的“id”传递. 现在……在我实际删除笔记之前,我需要确保笔记真正属于当前登录用户(User.Identity.Name aka UserId) 考虑我的方法deleteUserNote(int noteId)只接收一个“noteId”参数并考虑到我的UserLeadNotes TABLE在UserId上没有外键,我需要做的是添加一个
在我的_userLeadNoteRepository里面有类似的东西: UserLeadNote userLeadNote = _userLeadNoteRepository .AllIncluding(p => p.UserLead) .FirstOrDefault(p => p.UserLeadNoteID.Equals(noteId) && p.UserLead.UserID.Equals(User.Identity.Name)); 然后我会删除刚刚找到的UserLeadNote对象: _userLeadNoteRepository.Delete(userLeadNote); 问题: 按照上面的方法,这将迫使我a)为我的UserLeadNotes创建一个Repository和b)由于.Include(),找到的userLeadNote对象将有一个名为UserLead的属性,其中包含UserLead表中定义的所有字段. 如果我的UserLead表恰好有14个字段,其中10个字段是ntext,这意味着我将无需加载/保存太多信息! 如果我要使用Linq语句而不是Lambda表达式绕过存储库并直接使用我的Context: using(MyContext db = new MyContext ()) { var query = from uln in db.UserLeadNote join ul in db.UserLead on uln.UserLeadID equals ul.UserLeadID where uln.UserLeadNoteID == userLeadNoteID && ul.UserID == User.Identity.Name select uln; var userLeadNote = query.FirstOrDefault(); db.UserLeadNote.Remove(userLeadNote); db.SaveChanges(); } 这种方法不会更有效率,因为它不会从UserLead表中带回那些不必要的字段吗? (例如那10个ntext字段). 除非我没有正确使用存储库模式,否则这可能是一个实体框架问题,我想知道别人的想法! 请记住,我知道有一个存储库模式的好处,但好奇这是否是人们有或没有的某种问题.如果是这样,他们决定放弃模式并使用Linq语句直接使用他们的Context. 两个邪恶中较小的一个是什么? 解决方法
结论,
在阅读了Ryan和Rouen的帖子后,似乎每个实体创建一个存储库可能不是合适的方法.如果我有一个孩子(或孩子的孩子)实体,我应该创建一个单一的父资源库,并通过孩子(或孩子的孩子)导航. 我遇到的问题是,当试图删除子实体的子(没有Parent的外键)时,我必须.Include(“”)那些其他“上”表. (在我的情况下,它只有一个表,父,但一个人可能很容易删除一个孩子的孩子的孩子,并将必须包括()许多“父/上”表). 最后,包括Parent表创建了一个属性,该属性包含Parent的所有字段,在我的情况下,这被认为是“获取”过多的信息,用于我手边的简单任务. 如果我要删除存储库模式的使用,而是直接使用Context,则可以避免这个所谓的问题. 对于一些人来说,这可能不是一个问题(或者他们根本不知道发生了什么),对于其他人来说,拥有模式可能会超过它可能具有的缺点. 我还没有决定完全删除存储库模式,因为我喜欢它带来的内容. 谢谢大家. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何为asp.net身份创建安全邮戳值(IUserSecurityStampStore
- asp.net-mvc – MVC 3 tempdata容器的缺点
- asp.net – this.Page和(页面)HttpContext.Current.Handler
- asp.net-mvc – 使用IoC在Controller中注入HttpContextBase
- ASP.NET站点在开发期间自动登录
- asp.net – jQuery / ASP MVC – “$.ajax”调用中的parser
- ASP.NET Core:跟踪当前活动页面,或如何在视图中获取控制器
- asp.net – 无法加载文件或程序集“Microsoft.SqlServer.DT
- asp.net-mvc – mvc 4 beginform with route name
- asp.net-mvc – 摆脱仅在ASP.NET MVC中返回视图的控制器GET
- asp.net – 使用xml数据合并/填充pdf表单文件
- asp.net-mvc – 将ASP.NET MVC应用程序与Entity
- 为什么IIS不会执行我的自定义404页面?它试图改为
- 单个ASP.net网站与多个实例和web.configs
- 在asp.net页面之间传递数据
- asp.net – IIS Express全能子域名网址
- ASP.NET MVC和Web Forms在同一个Web应用程序中?
- asp.net-mvc-3 – 定义WebActivator.PreApplicat
- asp.net – 联合身份验证和“加密操作期间发生错
- asp.net-core – 当我们执行“kpm restore”时存