asp.net MVC - 如何通过不同的存储库类共享 SqlConnection 的同一实例

2024-06-25

我正在使用 MVC5 和普通 ADO.NET 创建一个新项目(只是作为学习练习),我需要创建一个存储库,用于注册一个模型,其中包含几个也需要同时创建的相关对象以及这些对象反过来可能需要插入其他对象。

我能想到的最简单的解决方案是拥有一个庞大的方法(在存储库中),该方法接收父对象的实例(其中包含需要插入的所有相关对象),并且还拥有一个接收所有相关对象的存储过程。数据作为表值参数,然后使用单个事务插入所有内容。

虽然这似乎是最直接的方法,但我不太喜欢它,所以我想知道是否有任何方法/常见做法可以用来共享为父对象创建的 SqlConnection 的同一实例与其他相关对象?

我在想也许在相关对象的构造函数中传递 SqlConnection 对象,这样每个存储库只需处理插入单个对象的逻辑,但我不确定。

Edit

-------------------------------------------

这是父对象(模型)的存储库,我认为应该实例化 SqlConnection 并启动事务

 public class ModelRepository : IModelRepository
    {
        public int Add(Model entity)
        {
            using (var conn = new SqlConnection(ConnectionString))
            {   
                conn.Open();
                using (var command = conn.CreateCommand())
                {                    
                    command.Transaction = conn.BeginTransaction(IsolationLevel.ReadCommitted);
                    command.CommandText = "up_Model_Insert";
                    command.CommandType = CommandType.StoredProcedure;                 
                    

                    command.Parameters.Add(command.CreateParameter("@pName ", entity.Name));
                    command.Parameters.Add(command.CreateParameter("@pDescription", entity.Description));
                    //Other parameters...

                    //Call the repositories of the other objects

                    //....

                    //how can I make the other repositories use the same connection and 
                    //transaction as the Model entity?


                    

                    
                    return Convert.ToInt32(command.ExecuteScalar());
                }
            }
        }
    }

问题是我不知道如何使其他存储库使用与“模型”实体相同的连接和事务。

我读过 Ninject 有这个“对象范围”概念 https://github.com/ninject/Ninject/wiki/Object-Scopes,但我不确定在我的情况下什么是正确的。


我不确定您为什么要“共享”连接。回到基础知识,您应该始终将连接封装在using块(假设您使用 EF)。

你追求的是交易,对吗?我现在脑子里想的就是: 你可以做的是将你的插入逻辑包装在TransactionInfo类。这些TransactionInfo课程可能需要Action和存储库作为参数。该操作最终执行通过给定存储库插入单个对象的逻辑(存储库应该遵循一些为您提供 CRUD 逻辑的接口)。

当你有多个TransactionInfo的,你可以把它们一起发送到某个地方,这样就可以开始一个逻辑数据库事务 https://msdn.microsoft.com/en-us/data/dn456843.aspx,执行所有给定的Actions从每个TransactionInfo对象并最终执行交易。

TransactionInfo可以有一个像这样的构造函数:

public TransactionInfo(Action action, ICrudRepository repository)

我希望我能很好地理解你。分享一个SqlConnection对我来说似乎是错误的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

asp.net MVC - 如何通过不同的存储库类共享 SqlConnection 的同一实例 的相关文章

  • 在 2 个 .c 文件之间共享函数

    dir1有dir2 file1 c和file1 h dir2 有 file2 c 现在 如果我想在 file2 c 中访问 file1 c 中定义的函数 我需要在 file1 h 中声明它并在 file2 c 中包含 file1 h 这是一
  • 在异步方法中使用时 HttpClient 标头被清空

    我正在使用 NET Framework 4 6 1 我的 Web api 中有一个控制器 其中有静态 HttpClient 来处理所有 http 请求 在 IIS 上托管我的应用程序后 大约每月一次 我的应用程序的所有传入请求都会出现以下异
  • ASP.NET MVC - 如何实现可重用的用户控件并保持DRY?

    第一次发帖 请多多包涵 在 ASP NET MVC 中创建用户控件时 构造代码的最佳方法是什么 以便调用使用用户控件的视图的控制器不必对控件了解太多 我想知道在 ASP NET MVC 中使用用户控件时保持 DRY 的好方法 请注意 此问题
  • C# Visual Studio 动态代码片段

    我正在开发一个 WinForms 项目 每天都会执行一些重复性的任务 所以我认为创建代码片段 https msdn microsoft com en us library ms165394 v vs 110 aspx会帮助我 但它仅适用于固
  • 多态性中基类缺少虚拟析构函数 = 资源泄漏?

    我们知道 如果要多态地使用基类 则需要将基类的析构函数指定为 virtual 否则程序中可能会出现资源泄漏 因为只会调用基类析构函数 而不会调用派生对象析构函数 我们还知道构造函数 析构函数纯粹是初始化 未初始化构造 而operator n
  • 命令中带空格的 Windows C 系统调用

    我无法使用名称和参数中的空格进行系统调用 例如 system c program files something example exe c my files example txt 我尝试过各种我知道的方法来逃避 但没有任何效果 我努力了
  • 如果 .txt 文件不存在,则创建一个,如果存在则追加新行

    我想创建一个 txt 文件并写入它 如果该文件已经存在 我只想添加更多行 string path E AppServ Example txt if File Exists path File Create path TextWriter t
  • 如何在 WCF 中反序列化自定义 SOAP 标头?

    我正在尝试向通过 WCF 的所有 SOAP 请求添加自定义标头 我发现这篇精彩的文章 http blogs msdn com b mohamedg archive 2012 10 21 adding custom soap headers
  • 解析通过asp:FileUpload上传的XML文件

    我有一个场景 用户将上传 XML 文件 我想将该文件添加到数据库中的表中 不过 困难的部分是我需要解析文件 然后将一些信息添加到一些不同的表中 显示如何获取 XML 文件的每个示例都使用 URI 来获取文件 但是如何直接从数据库获取文件 或
  • 嘲笑会员用户

    我目前正在开发一个 asp net mvc 2 应用程序 它使用默认的 SqlMembershipProvider 进行身份验证 我已经实现了一个控制器方法 通过调用读取当前用户的 ProviderUserKeyMembership Get
  • 如何在Windows Azure上调用ffmpeg.exe转换音频文件?

    我在 Windows Azure 上运行 Web 角色来接收 AAC 音频文件 通过 base64 字符串上传 并将它们存储到 blob 中 现在效果很好 接下来 我还必须将它们转换为 MP3 并将 MP3 存储到 blob 中 我决定使用
  • 实体框架中的导航属性是什么

    我是实体框架的新手 当Visual Studio创建模型图时我们主要可以看到Entities Propertie和Navigation Properties这两个东西 那么这些Navigation Properties是什么 如何使用它们
  • 链接错误:xxx 已在 *****.LIB 中定义:: 究竟出了什么问题?

    Problem 我正在尝试使用一个名为DCMTK http dicom offis de dcmtk它使用了一些其他外部库 zlib libtiff libpng libxml2 libiconv 我已经从同一网站下载了这些外部库 LIB
  • 如何在 Windows 8.1 上打开多个 Visual Studio 窗口? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我使用的是 Windows 7 我能够启动多个 Visual Studio 并同时工作 现在我有 Windows 8 1 操作系统 每当我
  • 将 R 值传递给采用 L 值的函数时出现过载歧义

    我有 2 个重载函数 一个采用 L 值 另一个采用 R 值 目的是让该函数可以像这样调用 Obj obj foo obj OR foo Obj 所以 我写了2个重载函数 template
  • 在 C# 中为 ListBox 分配数据源时,如何从 ListBox 中删除所选项目?

    在 C 中为 ListBox 分配数据源时 如何从 ListBox 中删除所选项目 尝试删除时出现错误 设置 DataSource 属性后 无法修改项目集合 但是当我尝试从数据源 数据表 中删除项目时 它会抛出错误 因为 数据行不在当前行集
  • 使用反射检测属性的访问修饰符类型

    我编写了一些代码来使用反射查看属性 我已经使用反射从类中检索了属性列表 但是我需要查明该财产是公共的还是受保护的 例如 public string Name get set protected int Age get set Propert
  • 预览MouseMove 与 MouseMove

    我有相当多的 XAML 经验 但最近我注意到我的大多数同事都使用预览鼠标移动代替鼠标移动事件 我一直用鼠标移动它对我很有帮助 但我忍不住问我什么时候应该使用预览鼠标移动什么时候鼠标移动 有什么区别 各自有什么优点和缺点等等 PreviewM
  • 通用存储库与 EF 4.1 的意义何在

    当我深入研究 DbContext DbSet 和相关接口时 我想知道为什么您需要围绕这些实现实现一个单独的 通用 存储库 看起来 DbContext 和 IDbSet 可以完成您需要的一切 并在 DbContext 中包含 工作单元 我是否
  • ASP.NET MVC3 Ajax.ActionLink - 条件确认对话框

    我有一个 Ajax ActionLink 仅当满足某些条件 用户有未保存的更改 时 我才希望显示一个确认对话框 我创建了一个 JavaScript 函数 它根据需要显示确认对话框 并根据响应返回 true 或 false 我将其绑定到 Ac

随机推荐

  • Sharepoint 2013 网站 NTLM 身份验证 javascript doPostBack 在 Safari 和 iPad 中不起作用

    我有一个非常有趣的问题 我们有一个使用 sharepoint 2013 创建的站点 我们使用 Windows NTLM 身份验证 在包含自定义讨论列表WebPart 的页面中 我们有一个过滤器按钮 它使用 javascript doPost
  • 为什么 Javascript 不支持lookbehind断言?

    最近我意识到 因有些尴尬 正则表达式lookbehind assertions were not可能在Javascript 这种看似常见的断言不存在的 事实 原因是什么 我意识到也许有其他方法可以实现同样的目标 https stackove
  • 将字符串转换为可绘制对象

    我想发出一个通知 在状态栏中显示一个图标 到目前为止一切顺利 但实际上我希望这个图标是一个 3 个字符的字符串 所以我的问题是 有没有办法将我的字符串转换为Drawable将其显示为状态栏中的图标 编辑 我最近发现了一个具有类似功能的应用程
  • 生成所有尺寸的android图标[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想知道 是否有任何工具可以生成所有尺寸的 android 图标 如 hdpi lpdi xxhdpi
  • 有没有办法让 saveAll() 删除无关的对象?

    我的主机对象有许多与其关联的选项对象 在编辑表单中 用户可以选择 取消 选择选项并保存新的关联集 这是通过对发布的数据使用 saveAll 来实现的 结果是 主机 主 对象已更新 更新先前关联和新关联中包含的选项 关联 对象 并且 将创建未
  • Objective-C 中的前向声明枚举

    我在 Objective C 程序中的枚举可见性方面遇到问题 我有两个头文件 其中一个定义了typedef enum 另一个文件需要使用typedef d type 在直C中 我会简单地 include另一个头文件 但在 Objective
  • 如何消除错误 服务无效 请检查您的设置并尝试

    我一直在努力工作 一切都很顺利 只是突然间 当我尝试构建我的项目时 我在 xCode 中收到以下错误 1 在构建时的警报框中 服务无效 请检查您的设置并重试 0xE8000022 只需重新启动您的 iPod 或 iPhone 即可
  • const_cast 的奇怪行为[重复]

    这个问题在这里已经有答案了 考虑以下代码 我声明了一个新的引用端 通过 const cast 将其分配给 a 值 然后我只需增加参考值打印地址和值 include
  • 如何在iis上部署React Next.JS?

    我有一个带有 Next Js 的 React Web 应用程序 我想将其上传到我的 IIS ftp 上 我应该复制 next 文件夹吗 如果是 为什么我在这种情况下会出错 错误截图 您可以在服务器上创建一个本地主机并将请求重定向到该本地主机
  • splice() 不更新 knockout.js 中数组的项目顺序

    继之前的帖子 https stackoverflow com questions 10258086 how do i swap two items in an observablearray关于如何更新数组的顺序 我遵循 Michael B
  • getMacAddress() 在 Android 11 中返回 null?如何获取Android 11的mac地址?

    try List
  • 在php中将png合并到多边形上

    我很困惑 我尝试简单地绘制一个多边形并放在上面 就像一个带有透明度的 png 图层一样 没有任何成功 一次背景是黑色的 一次多边形变得不可见 这是我的 php 代码 header Content type image png The png
  • 使用 pandas 覆盖 Excel 列同时保持格式

    我正在使用一个 xlsx 文件 如下所示 我之前的任务是修改名为 Entry 1 和 Entry 2 的列 我已将这些列存储在原始数据帧的单独切片中 以便更好地概览 我将让您快速浏览一下该切片的外观 gt gt gt slice df lo
  • 将 \n 替换为 Sublime Text 中的实际新行

    我该如何更换 n在 Sublime Text 中 真正的编辑器显示新行 如下所示 foo nbar becomes foo bar 当我查看编辑器中的文件时 Turn on Regex Search and Replace icon mos
  • 将布尔值转换为整数值php

    PHP 是否有任何内置函数可以接受布尔值并返回其等效整数 0 代表假 1 代表真 当然 您可以轻松创建一个函数来执行此操作 我只是问 PHP 内部是否有内置函数 我已经尝试过了intval 并将其投射到 int 但它们不起作用 在 TRUE
  • ReSharper 和 Rational Team Concert (RTC) - 它们配合得很好吗?

    我最近加入了一个小型开发团队 该团队正在考虑新的版本控制系统 由于它是大型组织的一部分 因此我们很可能采用 Rational Team Concert 的公司标准 我建议他们应该选择更简单的东西 但我可能不会如愿 我主要担心它无法与 ReS
  • Python Celery - 通过 pid 查找任务

    也许是一个非常简单的问题 我经常看到我的系统上运行着一个celery任务进程 但我在使用时却找不到celery task control inspect s active 方法 通常这个进程会运行几个小时 我担心它是某种僵尸 通常它也会消耗
  • 递归分层父子

    我有一个来自数据库的项目集合 该数据库具有parentid值或空 这是我的班级设计 public class Item public int id get set public string Name get set public int
  • 从父节点读取特定叶/子节点的 Firebase 规则

    我的 firebase 数据库看起来像这样 students firebase key 1 Name blah blah Address blah blah Roll No blah blah Marks Sub1 blah Sub2 bl
  • asp.net MVC - 如何通过不同的存储库类共享 SqlConnection 的同一实例

    我正在使用 MVC5 和普通 ADO NET 创建一个新项目 只是作为学习练习 我需要创建一个存储库 用于注册一个模型 其中包含几个也需要同时创建的相关对象以及这些对象反过来可能需要插入其他对象 我能想到的最简单的解决方案是拥有一个庞大的方