Сохранение объекта занимает много времени в Devexpress, почему?

Я не знаю, это моя ошибка или ошибка в 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 секунды. Я тестировал MS Access, MS SQL 2008 и MSSQL-Compact, но все они имеют одинаковый результат. любые советы приветствуются.


person Ehsan Zargar Ershadi    schedule 13.09.2012    source источник
comment
Добавьте это в свой app.config/web.config: <system.diagnostics> <switches> <add name="XPO" value="3" /> </switches> </system.diagnostics> Затем вы увидите все операторы sql, которые XPO выполняет в вашей консоли. Это поможет вам определить, почему это занимает так много времени.   -  person Filip    schedule 14.09.2012


Ответы (1)


Это кажется разумным временем для 1001 дискретной вставки. Объекты хранятся в памяти до тех пор, пока вы не вызовете CommitChanges, после чего они будут записаны в базу данных. Я не профилировал SQL, который генерирует XPO, но я не удивлюсь, если каждая вставка происходит внутри своей собственной неявной транзакции.

ИЗМЕНИТЬ

Я скомпилировал ваш код с помощью трассировки, предложенной Филипом, и второй NestedUnitOfWork фактически обновляет все дочерние элементы, даже если делать нечего (это в версии 12.1.7). Я не уверен, что это сделано по дизайну, но мне это кажется ошибкой.

Чтобы избежать ненужного обновления дочерних элементов, вы можете просто создать простой экземпляр UnitOfWork:

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

Это только обновит родительский объект. Но будьте осторожны: вам все равно понадобится NestedUnitOfWork для обновлений, которые повлияют на дочерние объекты.

person pixelbadger    schedule 14.09.2012
comment
Пожалуйста, посмотрите хорошенько!! в первом блоке 1001 вставляется за 7 секунд ( да это разумно ) а во втором блоке 1 обновление за 4 секунды ( НЕ РАЗУМНО ) , вы согласны ! - person Ehsan Zargar Ershadi; 14.09.2012
comment
Спасибо, Магос, это сэкономило мне много времени. Я использовал следующий код: использование (var uow = new UnitOfWork (dxs.DataLayer)) для подключения к MSSQL. Было бы любезно с вашей стороны, если бы вы сообщили мне, как вы это узнали. ;) - person Ehsan Zargar Ershadi; 15.09.2012