1

それが私の間違いなのか、Devexpres XPOのバグなのかわかりませんか?(バージョン12.1.5)
次のサンプルを見てください。

static void Main(string[] args)
    {
        var dxs = Session.DefaultSession;
        var sw = new Stopwatch();

        using (var uow = dxs.BeginNestedUnitOfWork())
        {
            var dbp = new DBParent(uow) { TitleXX = "Morgan" };

            // add 1000 child to the parent table
            for (var i = 0; i < 1000; i++)
            {
                var dbc = new DBChild(uow)
                              {
                                  Name = string.Format("Child {0}", i),
                                  Parent = dbp
                              };
            }

            var count = uow.GetObjectsToSave();
            // count = 1001
            sw.Start();
            uow.CommitChanges();
            sw.Stop();
            Console.WriteLine("Time:" +sw.Elapsed);
            // Takes about 7 sec
        }


        using (var uow = dxs.BeginNestedUnitOfWork())
        {
            var dbp = new XPCollection<DBParent>(uow).First();
            dbp.TitleXX = "Another title";
            dbp.Save();

            var count = uow.GetObjectsToSave();
            // count = 1
            sw.Reset();
            sw.Start();
            uow.CommitChanges();
            sw.Stop();
            Console.WriteLine("Time:" + sw.Elapsed); // Takes about 4 sec ????
        }
        Console.ReadLine();
    }
}

そしてここに私のオブジェクトがあります:

public class DBParent : XPObject
{
    public DBParent(){}
    public DBParent(Session session) : base(session) { }

    private string _TitleXX;
    public string TitleXX
    {
        get { return _TitleXX; }
        set { SetPropertyValue("TitleXX", ref _TitleXX, value); }
    }

    [Association("a1"), Aggregated]
    public XPCollection<DBChild> Childs
    {
        get
        {
            return GetCollection<DBChild>("Childs");                
        }
    }      
}


public class DBChild : XPObject
{
    public DBChild(){}
    public DBChild(Session session): base(session){}

    private string _Name;       
    public string Name
    {
        get { return _Name; }
        set { SetPropertyValue("Name", ref _Name, value); }
    }

    private DBParent _Parent;
    [Association("a1")]
    public DBParent Parent
    {
        get { return _Parent; }
        set { SetPropertyValue("Parent", ref _Parent, value); }
    }       
}

ご覧のとおり、1001(1000子+ 1親)の保存には7秒かかり、次のブロックでは1親オブジェクトの更新に4秒かかります。MSAccessとMSSQL2008およびMSSQL-Compactに対してテストしましたが、すべて同じ結果になります。アドバイスをいただければ幸いです。

4

1 に答える 1

1

これは、1001個のディスクリートインサートにとって妥当な時間のようです。オブジェクトは、CommitChangesを呼び出すまでメモリに保持され、その時点でデータベースに書き込まれます。XPOが生成するSQLのプロファイルは作成していませんが、各挿入が独自の暗黙的なトランザクション内で行われたとしても驚かないでしょう。

編集

Filipによって提案されたトレースを使用してコードをコンパイルしました。2番目のNestedUnitOfWorkは、実行する作業がない場合でも、実際にはすべての子を更新しています(これはバージョン12.1.7にあります)。これが仕様によるものかどうかはわかりませんが、私にはバグのように思えます。

子を不必要に更新しないようにするには、単純なUnitOfWorkをインスタンス化するだけです。

using (var uow = new UnitOfWork())
{
    //...
}

これにより、親オブジェクトのみが更新されます。ただし、注意してください。子オブジェクトに影響を与える更新には、NestedUnitOfWorkが必要です。

于 2012-09-14T00:10:47.277 に答える