Я уже проверил это с помощью профилировщика памяти, и в памяти не осталось реальных сущностей , но хеш-наборы, словари и объекты EntityKey - но я не нашел способа отключить эти ссылки.
Очень простой вопрос: как мне остановить контекст (или его ObjectStateManager) с , увеличивающимся в бесконечность в размере?контекстов следует избегать, но в этом случае это один комплексный прогон анализа, который требует загрузки нескольких иерархических данных (а приведенный ниже пример - просто минимальная демонстрация проблемы), так что, наконец, это «короткий» живой контекст одной операции.]
Шаги для воспроизведения:
- создать новое консольное приложение
- создать модель EF для базы данных Northwind (либо использовать настоящий SQL Server, либо скопировать Northwind.sdf из папки Compact Samples)
- используйте код ниже:
Код [Обновлено, больше не требуется соединение с БД]:
class Program
{
static void Main()
{
const double MiB = 1024 * 1024;
using ( var context = new NorthwindEntities() )
{
var last = GC.GetTotalMemory(true) / MiB;
Console.WriteLine("before run: {0:n3} MiB", last);
var id = 0;
while ( true )
{
Run(context, ref id);
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
var current = GC.GetTotalMemory(true) / MiB;
Console.WriteLine("after run: {0:n3} MiB (+{1:n3} MiB)", current, current - last);
last = current;
if ( Console.KeyAvailable )
break;
Console.WriteLine(new string('-', 100));
}
}
}
static void Run(NorthwindEntities context, ref int id)
{
for ( int i = 0; i < 100000; i++ )
{
var category = new Category { Category_ID = ++id };
category.EntityKey = new EntityKey("NorthwindEntities.Categories", "Category_ID", id);
var product = new Product { Product_ID = id, Category_ID = id };
product.EntityKey = new EntityKey("NorthwindEntities.Products", "Product_ID", id);
product.Category = category;
context.Attach(product);
context.Detach(product);
context.Detach(category);
}
var ctr = 0;
Console.WriteLine("Enumerating living/attached objects:");
const EntityState AllStates = EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged;
foreach ( var entry in context.ObjectStateManager.GetObjectStateEntries(AllStates) )
Console.WriteLine(" #{0} [{1}] {2}", ++ctr, entry.EntityKey, entry.Entity);
if ( ctr == 0 )
Console.WriteLine(" NOTHING (as expected)");
}
}