2012-09-13 169 views
1

我不知道這是我的錯誤還是Devexpres XPO中的錯誤? (版本12.1.5)
看看下面的示例:
保存對象在Devexpress中需要很長時間,爲什麼?

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秒。我已經針對MS Access和MS SQL 2008以及MSSQL-Compact進行了測試,但都具有相同的結果。任何意見,讚賞。

+3

添加到您的app.config/web.config中: ' <添加名稱= 「XPO」 值= 「3」/> ' 然後您將看到XPO在您的控制檯中執行的所有sql語句。這將幫助你確定爲什麼需要這麼長時間。 – Filip

回答

1

對於1001個不連續的插入,這似乎是一段合理的時間長度。這些對象保存在內存中,直到您將CommitChanges寫入數據庫爲止。我沒有分析XPO生成的SQL,但是如果每次插入發生在它自己的隱式事務中,我都不會感到驚訝。

編輯

我編譯與菲利普建議的跟蹤代碼,而第二NestedUnitOfWork實際上是更新所有的孩子,即使沒有工作要做(這是12.1版本。 7)。我不確定這是否是設計,但它確實對我來說似乎是一個錯誤。

爲了避免不必要地更新孩子,你可以實例化一個普通的UnitOfWork:

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

這隻會更新父對象。但要小心:您仍然需要一個NestedUnitOfWork來進行影響子對象的更新。

+0

請好好看看!在第一塊1001插入7秒(是的,這是合理的),但在第二塊1更新4秒(不合理),你同意! –

+0

感謝馬戈斯,這爲我節省了很多時間。我使用了下面的代碼:爲我的MSSQL連接使用(var uow = new UnitOfWork(dxs.DataLayer))。如果你讓我知道你是如何發現它的,那將會是你的好東西。) –

相關問題