加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 存储库模式:好还是坏?

发布时间:2020-12-16 09:50:20 所属栏目:asp.Net 来源:网络整理
导读:在阅读了ASP.NET MVC 3.0项目中的存储库设计模式的好处(并使用)后,我遇到了一个令我困惑的问题,并开始质疑该模式的好处.也许有人可以帮我澄清一下. 我有以下3个表格: – 用户(父母) -UserLead(用户的孩子) -UserLeadNotes(UserLead的子节点) 粗略地说,表格
在阅读了ASP.NET MVC 3.0项目中的存储库设计模式的好处(并使用)后,我遇到了一个令我困惑的问题,并开始质疑该模式的好处.也许有人可以帮我澄清一下.

我有以下3个表格:

> – 用户(父母)
> -UserLead(用户的孩子)
> -UserLeadNotes(UserLead的子节点)

粗略地说,表格及其关系的设计如下:

>用户[Id]
> UserLead [Id,UserId(外键)]
> UserLeadNotes [Id,UserLeadId(外键)]

我有一个BaseRepository,它包含基本的CRUD方法.
(IEnumerable< TEntity> Get(),TEntity GetByID(),Insert(),Delete()等…)

有了这个,我还有一个服务层,可以在需要时调用适当的存储库.

简而言之,应用程序显示UserLead并允许用户向UserLead添加/删除注释(在UserLeadNotes表中存储/删除).添加/删除注释是通过Ajax调用完成的.删除笔记沿着我想要删除的笔记的“id”传递.

现在……在我实际删除笔记之前,我需要确保笔记真正属于当前登录用户(User.Identity.Name aka UserId)

考虑我的方法deleteUserNote(int noteId)只接收一个“noteId”参数并考虑到我的UserLeadNotes TABLE在UserId上没有外键,我需要做的是添加一个

.Include(“UserLead’)

在我的_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,则可以避免这个所谓的问题.

对于一些人来说,这可能不是一个问题(或者他们根本不知道发生了什么),对于其他人来说,拥有模式可能会超过它可能具有的缺点.

我还没有决定完全删除存储库模式,因为我喜欢它带来的内容.

谢谢大家.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读