gpt4 book ai didi

orm - 大规模 ORM - 多个表上的事务

转载 作者:行者123 更新时间:2023-12-05 00:00:15 25 4
gpt4 key购买 nike

我一直在研究 Massive ORM。不要忘记,只是看,我还没有做任何编码。

我对保存交易数据的可能性感兴趣。我已经看到可以在一个事务中在同一个表中保存 20 行。但是当我想在单个交易中保存一个订单并且它是订单行时会发生什么?这可能吗,怎么办?

最佳答案

Massive 的 Save() 方法声明如下所示:

Save(params object[] things)

...在内部,它对传入的每个对象执行 foreach 循环,并在单个事务中将其保存到数据库中,因此它已经执行了您希望它执行的操作。

现在,如果您想自己控制事务,那么让我们开始吧。

首先,Massive 中几乎每个方法都标记为虚拟,因此我们可以覆盖派生类中的任何方法,这就是我们要做的。现在,所有对 Save() 的调用最终都会通过一个 Execute() 方法,该方法采用 DbCommand 的 IEnumerable,因此我们将在派生类中覆盖该方法。

这是我们的派生类:

public class ExtendedDynamicModel : DynamicModel
{
// Lets add two properties that we will reference in our overridden Execute method
public System.Data.IDbConnection Connection;
public System.Data.IDbTransaction Transaction;

public ExtendedDynamicModel( string connectionStringName, string tableName = "",
string primaryKeyField = "", string descriptorField = "" )
: base( connectionStringName, tableName, primaryKeyField, descriptorField )
{
}

// Lets override the Execute method and if we've supplied a Connection, then let's
// using our own custom implementation otherwise use Massive's default implementation.
public override int Execute( IEnumerable<System.Data.Common.DbCommand> commands )
{
if ( Connection == null ) return base.Execute( commands );

var result = 0;

foreach ( var cmd in commands as IEnumerable<System.Data.IDbCommand> )
{
cmd.Connection = Connection;
cmd.Transaction = Transaction;
result += cmd.ExecuteNonQuery();
}

return result;
}
}

所以现在我们只需要将我们自己的 IDbConnection 和 IDbTransaction 提供给我们新的 ExtendedDynamicModel 类,如下所示:

var database = new ExtendedDynamicModel( "YourConnectionString" );

using ( var connection = database.Connection = database.OpenConnection() )
{
using ( var tx = database.Transaction = connection.BeginTransaction() )
{
// Do your saving here

if ( true )
{
tx.Commit();
}
else
{
tx.Rollback();
}
}
}

所以现在我们可以在需要时完全控制提交或回滚事务。

链接到 Massive 的源代码以供引用: https://github.com/robconery/massive/

关于orm - 大规模 ORM - 多个表上的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10528862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com