我一直在研究大规模的 ORM。别忘了,只是看看,我还没有做任何编码。
我对保存数据事务的可能性感兴趣。我已经看到可以在一个事务中保存同一张表中的 20 行。但是当我想在单个事务中保存一个订单和它的订单时会发生什么?这可能吗,怎么做?
我一直在研究大规模的 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/
我一直在研究这个,这是我使用Massive 的默认交易的看法:我正在利用
table.Execute(IEnumerable<DbCommands>)
这是一些假设的示例代码
private bool BigSave(int id)
{
var saveList = new List<DbCommand>();
var tblO = new Order();
var order = tblO.Single(key: id); /* get the order record */
order.OrderDate = DateTime.Today; /* update order's fields */
/* more updates if needed */
saveList.Add(tblO.CreateUpdateCommand(order, id)); /* add Order to command list */
/* now delete some existing order lines */
var lines2Delete = "25, 31, 33" // let's assume some comma separated Ids
var tblL = new OrderLines();
saveList.Add(tblL.CreateDeleteCommand(string.Format("WHERE Id IN ({0})", lines2Delete)));
/* now add some new Orderlines */
/* for this usually I create a List<dynamic> */
var newLines = new List<dynamic>(); /* add your objects to this list */
/* now add each of those to the List of Save commands using a foreach loop */
/* or LINQ:
saveList.AddRange(newLines.Select(o => tblL.CreateInsertCommand(o).Cast<DbCommand>());
*/
tblO.Execute(saveList); //boom: save everything in a Transaction!
}