我一直在研究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;
}
}
因此,现在我们只需要向新的ExtendedDynamicModel类提供我们自己的IDbConnection和IDbTransaction,如下所示:
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/