多表上的大规模ORM事务

多表上的大规模ORM事务,orm,transactions,massive,Orm,Transactions,Massive,我一直在看大型ORM。别忘了,只是看看,我还没有做任何编码 我对保存事务数据的可能性感兴趣。我发现在一个事务中可以在同一个表中保存20行。但是当我想在单个事务中保存订单及其订单行时会发生什么?这有可能吗?Massive的Save()方法声明如下所示: Save(params对象[]事物) …在内部,它对传入的每个对象执行foreach循环,并在单个事务中将其保存到数据库中,这样它就已经执行了您希望它执行的操作 现在,如果您想自己控制事务,那么让我们开始吧 首先,Massive中几乎每个方法都标

我一直在看大型ORM。别忘了,只是看看,我还没有做任何编码

我对保存事务数据的可能性感兴趣。我发现在一个事务中可以在同一个表中保存20行。但是当我想在单个事务中保存订单及其订单行时会发生什么?这有可能吗?Massive的Save()方法声明如下所示:

Save(params对象[]事物)
…在内部,它对传入的每个对象执行foreach循环,并在单个事务中将其保存到数据库中,这样它就已经执行了您希望它执行的操作

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

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

下面是我们的派生类:

public类扩展的DynamicModel:DynamicModel
{
//让我们添加两个将在重写的Execute方法中引用的属性
public System.Data.idb连接;
public System.Data.IDbTransaction事务;
公共扩展动态模型(字符串连接字符串名称,字符串表名=”,
字符串primaryKeyField=“”,字符串描述符字段=“”)
:base(connectionStringName、tableName、primaryKeyField、descriptorField)
{
}
//让我们重写Execute方法,如果我们提供了连接,那么让我们
//使用我们自己的自定义实现,否则使用Massive的默认实现。
公共重写int-Execute(IEnumerable命令)
{
if(Connection==null)返回base.Execute(命令);
var结果=0;
foreach(命令中的var cmd作为IEnumerable)
{
cmd.Connection=连接;
cmd.Transaction=Transaction;
结果+=cmd.ExecuteNonQuery();
}
返回结果;
}
}
现在我们只需要向新的ExtendedDynamicModel类提供我们自己的IDbConnection和IDbTransaction,如下所示:

var数据库=新的扩展动态模型(“YourConnectionString”);
使用(var connection=database.connection=database.OpenConnection())
{
使用(var tx=database.Transaction=connection.BeginTransaction())
{
//你在这里存钱吗
如果(真)
{
tx.Commit();
}
其他的
{
tx.回滚();
}
}
}
因此,如果需要,现在我们可以完全控制提交或回滚事务


链接到Massive的源代码以供参考:

我已经查看了一段时间,下面是我使用Massive的默认事务对它的看法:我正在利用

table.Execute(IEnumerable<DbCommands>)
table.Execute(IEnumerable)
下面是一些假设的示例代码

private bool BigSave(int-id)
{
var saveList=新列表();
var tblO=新订单();
var order=tblO.Single(key:id);/*获取订单记录*/
order.OrderDate=DateTime.Today;/*更新订单字段*/
/*如果需要,请提供更多更新*/
saveList.Add(tblO.CreateUpdateCommand(order,id));/*将order添加到命令列表*/
/*现在删除一些现有的订单行*/
var lines2Delete=“25,31,33”//让我们假设一些逗号分隔的ID
var tblL=新订单行();
Add(tblL.CreateDeleteCommand(string.Format(“whereid IN({0})”,lines2Delete));
/*现在添加一些新的订单行*/
/*为此,我通常创建一个列表*/
var newLines=new List();/*将对象添加到此列表*/
/*现在使用foreach循环将这些命令添加到Save命令列表中*/
/*或者林克:
AddRange(newLines.Select(o=>tblL.CreateInsertCommand(o.Cast());
*/
tblO.Execute(saveList);//boom:保存事务中的所有内容!
}