在阅读了ASP.NET MVC 3.0项目中的存储库设计模式的好处(并使用)后,我遇到了一个令我困惑的问题,并开始质疑该模式的好处。也许有人可以帮我澄清一下。
我有以下3个表:
parent
)child of User
)child of UserLead
)粗略地说,表格及其关系的设计如下:
我有一个BaseRepository,它包含基本的CRUD方法。
(IEnumerable<TEntity> Get(), TEntity GetByID(), Insert(), Delete(), etc…)
有了这个,我还有一个Service Layer
,在需要的时候调用适当的存储库。
简而言之,应用程序显示UserLead并允许用户向UserLead添加/删除注释(在UserLeadNotes表中存储/删除)。添加/删除注释是通过Ajax调用完成的。注释的删除沿着我要删除的注释的“id”
传递。
现在......在我实际删除笔记之前,我需要确保笔记真正属于当前登录用户(User.Identity.Name aka UserId
)
考虑到我的UserLeadNotes TABLE 不在{{1}上有外键,考虑我的方法deleteUserNote(int noteId)
只会收到“noteId”
参数 AND 我需要做的是添加一个
.INCLUDE(“UserLead”)
在我的UserId
内有类似的内容:
_userLeadNoteRepository
然后我会删除刚刚找到的 UserLeadNote 对象:
UserLeadNote userLeadNote = _userLeadNoteRepository
.AllIncluding(p => p.UserLead)
.FirstOrDefault(p => p.UserLeadNoteID.Equals(noteId)
&& p.UserLead.UserID.Equals(User.Identity.Name));
问题:
按照上述方法,这将迫使我_userLeadNoteRepository.Delete(userLeadNote);
为我的UserLeadNotes和a)
创建一个存储库,因为.Include()所发现的userLeadNote对象将具有一个名为{{1}的属性保存UserLead表中定义的所有字段。
如果我的UserLead表恰好有14个字段,其中10个字段是 ntext ,那意味着我将无需加载/保存太多信息!
如果我要使用而不是Lambda表达式,Linq语句绕过存储库并直接使用我的上下文:
b)
这种方法不会更有效率,因为它会不从UserLead表中带回那些不必要的字段吗? (例如,那10个ntext字段)。
除非我没有正确使用存储库模式,或者这可能是实体框架问题,否则我想知道别人的想法!
请记住,我知道拥有存储库模式的好处,但如果这是人们有或没有的某种问题,那就很好奇。如果是这样,他们决定放弃模式并使用Linq语句直接使用他们的Context。
两个邪恶中较小的一个是什么?
答案 0 :(得分:2)
总之,
阅读Ryan和Rouen的帖子后,似乎每个实体创建一个存储库可能不是合适的方法。如果我有一个孩子(或孩子的孩子)实体,我应该创建一个单一的父信息库,并通过孩子(或孩子的孩子)导航。
我遇到的问题是,当尝试删除子实体的子项(没有Parent的外键)时,我必须.Include(“”)
那些其他“上”表。 (在我的情况下,它只有一个表,父,但一个人很容易删除一个孩子的孩子的孩子,并且必须Include()
许多“父母/上层”表。
最后,包含Parent表创建了一个属性,该属性包含Parent的所有字段,在我的情况下,这被认为是“获取”太多信息,用于我手边的简单任务。
如果我要删除存储库模式的使用而不是直接使用Context,那么可以避免这个所谓的问题。
对于某些人来说,这可能不是问题(或者他们根本不知道发生了什么),而对于其他人来说,使用模式可能会超过其可能的缺点。
我还没有决定完全删除存储库模式,因为我喜欢它带来的内容。
感谢所有人。
答案 1 :(得分:1)