We checked into this and did a test creating 100,000 entities with errors. The resulting difference between memory at the start and at the end of the operation was around 5000 bytes, which is normal.
[TestMethod]
public void MemoryCheckWithErrorsChangedHandler() {
var mgr = new DomainModelEntityManager();
MemoryCheckCore(mgr);
long memStart = GC.GetTotalMemory(true);
for (int i = 0; i < 10; i++) {
MemoryCheckCore(mgr);
}
mgr = null;
long memEnd = GC.GetTotalMemory(true);
long diff = memEnd - memStart;
Assert.IsTrue(diff < 10000);
Console.WriteLine("diff = " + diff);
}
private void MemoryCheckCore(DomainModelEntityManager mgr) {
var employees = CreateTestEmployees(mgr);
foreach (var emp in employees) {
var indei = (INotifyDataErrorInfo)emp;
indei.ErrorsChanged += indei_ErrorsChanged;
GenerateErrors(emp);
Assert.IsTrue(emp.EntityAspect.ValidationErrors.Count > 0);
}
//This does the same thing as mgr.Clear()
//foreach (var emp in employees) {
// var indei = (INotifyDataErrorInfo)emp;
// indei.ErrorsChanged -= indei_ErrorsChanged;
// indei = null;
// emp.EntityAspect.RemoveFromManager();
//}
employees = null;
mgr.Clear();
}
private List<Employee> CreateTestEmployees(DomainModelEntityManager mgr) {
for (int i = 0; i < 10000; i++) {
//var emp = mgr.CreateEntity<Employee>();
var emp = new Employee();
emp.Id = -(i + 100);
//emp.EntityAspect.AddToManager();
mgr.AddEntity(emp);
}
return mgr.Employees.With(QueryStrategy.CacheOnly).ToList();
}
private void GenerateErrors(Employee emp) {
emp.FirstName = null;
emp.LastName = null;
}
void indei_ErrorsChanged(object sender, DataErrorsChangedEventArgs e) {
var propName = e.PropertyName;
}