2012-09-13 126 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))。如果你让我知道你是如何发现它的,那将会是你的好东西。) –

相关问题