Я использую Entity Framework 4.2, и у меня довольно серьезная проблема с производительностью. Я использую подход POCO, унаследованный от DbContext, и вот небольшой пример, объясняющий проблему:
У меня есть база данных с двумя таблицами - A и B:
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 секунд!
Буду очень признателен за любые советы, чтобы это произошло быстрее. Спасибо большое!