我正在使用 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(使用前将#替换为@)