4

私はMassive ORMを見てきました。見ただけで、まだコーディングを行っていないことを忘れないでください。

データをトランザクションとして保存する可能性に興味があります。1 回のトランザクションで同じテーブルに 20 行を保存できることを確認しました。しかし、注文を保存したいのですが、それが単一のトランザクション内の注文明細である場合はどうなりますか? それは可能ですか?

4

2 に答える 2

6

MassiveのSave()メソッド宣言は次のようになります。

Save(params object[] things)

...そして内部的には、渡された各オブジェクトに対してforeachループを実行し、単一のトランザクションでデータベースに保存するため、必要な処理をすでに実行しています。

トランザクションを自分で制御したい場合は、始めましょう。

まず、Massiveのほぼすべてのメソッドが仮想としてマークされているため、派生クラスのすべてのメソッドをオーバーライドして、それを実行します。これで、Save()のすべての呼び出しは、最終的にDbCommandのIEnumerableを受け取るExecute()メソッドを経由するため、派生クラスでそのメソッドをオーバーライドします。

派生クラスは次のとおりです。

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/

于 2012-08-07T05:03:22.613 に答える