2012-05-10 37 views
4

我一直在看Massive ORM。不要忘記,只是看,我還沒有做任何編碼。海量ORM - 多個表上的交易

我對保存數據事務的可能性感興趣。我已經看到可以在同一個表中保存20行。但是當我想要在單個交易中保存訂單並且它是Orderlines時會發生什麼?這是可能的,怎麼樣?

回答

5

Massive的Save()方法的聲明看起來是這樣的:

Save(params object[] things) 

...並在內部它在傳遞中的每個對象foreach循環,所以它已經做它在單個事務保存到數據庫你想要它做什麼。

現在,如果您想親自控制交易,那就讓我們開始吧。

首先,Massive中幾乎所有的方法都被標記爲虛擬的,因此我們可以重寫派生類中的任何方法,這就是我們要做的。現在,所有對Save()的調用最終都會經過一個Execute()方法,該方法接受一個I​​Enumerable的DbCommand,因此我們將在派生類中重寫該方法。

這裏是我們的派生類:

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(); 
     } 
    } 
} 

所以現在我們有完全的控制如果我們需要的話,可以承諾或回滾交易。

鏈接到大規模的源代碼,以供參考:https://github.com/robconery/massive/

1

我一直在尋找在這一個了一段時間,這裏是我對只是使用大規模的默認事務:中

我趁着
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! 

}