Ускорение Entity Framework 4.2 POCO

Я использую Entity Framework 4.2, и у меня довольно серьезная проблема с производительностью. Я использую подход POCO, унаследованный от DbContext, и вот небольшой пример, объясняющий проблему:

У меня есть база данных с двумя таблицами - A и B:

A

  • AId (int - not null - идентификатор - первичный ключ)
  • Имя (nvarchar (50) - не null)

B

  • BId (int - не null - идентификатор - первичный ключ)
  • SomeValue (int - не null)
  • AId (int - not null - внешний ключ, соединяющийся с AId в таблице A)

A имеет одну строку (1, 'Test'), а B имеет 6000 строк (SomeValue - это просто число от 0 до 5999 ) - все они ссылаются на строку A через столбец внешнего ключа.

Я создаю edmx из базы данных и выключаю генерацию кода. Затем я создаю следующие классы:

public class DatabaseContext : DbContext
{
    public DatabaseContext(string name) : base(name)
    {
        Configuration.AutoDetectChangesEnabled = false;
        As = Set<A>();
        Bs = Set<B>();
    }

    public DbSet<A> As { get; private set; }
    public DbSet<B> Bs { get; private set; }
}

public class A
{
    public virtual int AId { get; set; }
    public virtual string Name { get; set; }
    public virtual ICollection<B> Bs { get; private set; }

    public void AddB(B b)
    {
        if (b == null)
        {
            throw new ArgumentNullException("b");
        }

        if (Bs == null)
        {
            Bs = new List<B>();
        }

        if (!Bs.Contains(b))
        {
            Bs.Add(b);
        }

        b.A = this;
    }
}

public class B
{
    public virtual int BId { get; set; }
    public virtual A A { get; set; }
    public virtual int SomeValue { get; set; }
}

Теперь я просто делаю следующее:

var ctx = new DatabaseContext("ScalabilityTestEntities");
var a = ctx.As.FirstOrDefault();
a.Bs.Add(new B { SomeValue = 987 });

Последняя строка (где я добавляю новый B) занимает примерно 6 секунд на моем четырехъядерном процессоре, 4 ГБ ОЗУ, 64-разрядная версия Windows 7 машина, на которой база данных работает локально.

На самом деле плохо то, что он, кажется, ухудшается экспоненциально, поскольку если вы удвоите количество строк в B, это займет около 20 секунд!

Буду очень признателен за любые советы, чтобы это произошло быстрее. Спасибо большое!

5
задан kmp 17 November 2011 в 16:51
поделиться