Entity Framework 4.3和SQL Server Compact Edition 3.5的更新速度很慢

时间:2012-03-14 07:54:35

标签: c# entity-framework sql-server-ce

我正在开发一个使用SQL Server Compact Edition数据库和Entity Framework的WPF应用程序,但是我的更新和删除性能非常低。所以我创建了一个简单的Foobar控制台应用程序(如下所示)并遇到了同样的问题。

据我所知,Entity Framework会产生一些开销,而SQL Server Compact Edition比常规SQL Server慢。但是INSERTUPDATE/DELETE之间的差异是多少?

主要

    public static void CreateFoobars()
    {
        DateTime start = DateTime.Now;

        for (int i = 0; i < 10000; i++)
        {
            Foobar foobar = new Foobar();
            foobar.FoobarID = i;
            foobar.Column1 = "Column1";
            foobar.Column2 = "Column2";
            foobar.Column3 = "Column3";
            foobar.Column4 = "Column4";

            _localRepository.CreateFoobar(foobar);
        }

        bool result = _localRepository.Save();

        TimeSpan timeSpan = CalculateTimeSpan(start, DateTime.Now);

        Console.WriteLine("Created Foobars? {0}, Time: {1}", result, timeSpan);
    }

    public static void CountFoobars()
    {
        Console.WriteLine("Count Foobars: {0}", _localRepository.GetAllFoobars().Count());
    }

    public static void UpdateFoobars()
    {
        DateTime start = DateTime.Now;

        for (int i = 0; i < 10000; i++)
        {
            Foobar foobar = new Foobar();
            foobar.FoobarID = i;
            foobar.Column1 = "Column11";
            foobar.Column2 = "Column22";
            foobar.Column3 = "Column33";
            foobar.Column4 = "Column44";

            _localRepository.UpdateFoobar(foobar);
        }

        bool result = _localRepository.Save();

        TimeSpan timeSpan = CalculateTimeSpan(start, DateTime.Now);

        Console.WriteLine("Updated Foobars? {0}, Time: {1}", result, timeSpan);
    }

    public static void DeleteFoobars()
    {
        DateTime start = DateTime.Now;

        for (int i = 0; i < 10000; i++)
        {
            _localRepository.DeleteFoobar(i);
        }

        bool result = _localRepository.Save();

        TimeSpan timeSpan = CalculateTimeSpan(start, DateTime.Now);

        Console.WriteLine("Deleted Foobars? {0}, Time: {1}", result, timeSpan);
    }

存储库

    public IQueryable<Foobar> GetAllFoobars()
    {
        return _entities.Foobars;
    }

    public Foobar GetFoobar(int foobarID)
    {
        return _entities.Foobars.ByFoobarID(foobarID).FirstOrDefault();
    }

    public bool CreateFoobar(Foobar foobar)
    {
        try
        {
            _entities.AddToFoobars(foobar);
        }
        catch (Exception e)
        {
        }

        return false;
    }

    public bool UpdateFoobar(Foobar foobar)
    {
        try
        {
            Foobar f = this.GetFoobar(foobar.FoobarID);

            if (f != null)
            {

                f.Column1 = foobar.Column1;
                f.Column2 = foobar.Column2;
                f.Column3 = foobar.Column3;
                f.Column4 = foobar.Column4;

                return true;
            }
        }
        catch (Exception e)
        {
        }

        return false;
    }

    public bool DeleteFoobar(int foobarID)
    {
        try
        {
            Foobar f = this.GetFoobar(foobarID);

            if (f != null)
            {
                _entities.DeleteObject(f);

                return true;
            }
        }
        catch (Exception e)
        {
        }

        return false;
    }

    public bool Save()
    {
        try
        {
            this.Context.SaveChanges();

            return true;
        }
        catch (Exception e)
        {
        }

        return false;
    }

结果(在带有SSD和16 RAM的i7上,旧版C2D的时间几乎翻倍)

  • Count Foobars:0
  • 创建了Foobars?是的,时间:00:00:04:0700057
  • Count Foobars:10000
  • 更新Foobars?是的,时间:00:00:59:8800838
  • Count Foobars:10000
  • 删除了Foobars?是的,时间:00:00:57:8000810
  • Count Foobars:0

测试

  • LazyLoading = false
  • 在数据库中禁用身份。

1 个答案:

答案 0 :(得分:0)

我怀疑你的创建函数更快,因为它只是创建了10000个本地对象,然后将它们全部一步提交到数据库,而删除和更新函数都在更改之前从数据库中查询一个项目。