У вас фактически есть преждевременное удаление, а не позднее, поскольку сущности, участвующие в замыкании, назначенном источнику данных, означают, что он покидает область действия.
Вы затем вывел сущности в дикую природу, которые не будут располагаться в своем реальном объеме, на что жалуется анализ, но вряд ли это будет проблемой по сравнению с тем фактом, что они удаляются до того, как они используются в последний раз.
Опции:
Оставьте все как есть.Если вышеупомянутое работает, то это , вероятно , потому что удаление не влияет на необходимое состояние для закрытия.Это рискованно.Ставки на «вероятно» не очень хорошая идея, и они могут измениться в будущем.(Я могу вспомнить один случай, когда использование объекта после утилизации имеет смысл, но это неясно, а не то, что у вас здесь есть).
Принудительно выполнить запрос с нетерпением.Вызов ToList()
или ToArray()
для запроса запустит его и создаст результат в памяти, который затем будет использоваться в качестве источника данных.В лучшем случае это будет менее эффективно как в пространстве, так и во времени.В худшем случае это может быть ужасно (в зависимости от размера результатов, с которыми вы имеете дело).
Убедитесь, что элемент управления завершает использование своего источника данных, прежде чем покинуть область.Затем очистите источник данных.В зависимости от рассматриваемого элемента управления и некоторых других вопросов (в частности, если у него есть явный метод DataBind()
), это может быть тривиально, невозможно или где-то посередине сделать это.
Поместите сущность в переменную экземпляра.Реализация IDisposable
.В вашем методе Dispose()
вызовите его Dispose()
.Не добавляйте финализатор для этого, поскольку вы только удаляете управляемый объект.
Создайте перечислимый метод, который переносит запрос (и использование), а затем выполняет yield return
длякаждый элемент, который возвращает запрос.Используйте это как источник данных.
5 кажется лучшим выбором для большинства случаев.Он имеет преимущество в том, что не сильно меняет код, не добавляя (потенциально большие, в зависимости от данных) служебные данные числа 2. Обратите внимание, что просто вызов AsEnumerable
(который имеет почти , тот же эффект влияет на порядок выполнения).) не будет иметь тот же эффект, так как закрытие все равно оставит блок неисполненным.
Редактировать: перечисляемый, который оборачивает запрос, будет выглядеть так:
private IEnumerable GetSessions()
{
using (var entities = new DbEntities(Properties.Settings.Default.UserConnectionString))
{
entities.CommandTimeout = 7200;
var sessions = from t in entities.TableName
where t.UserSession.Id == _id && t.Parent == 0
group t by new { t.UserSession, t.UserSession.SessionId } into sessionGroup
select new
{
Id = sessionGroup.Key.UserSession,
Session = sessionGroup.Key.SessionId
};
foreach(var sess in sessions.Where(x => x.Time > 0.00))
yield return sess;
}
}
Тогда вы должны установитьизмените SessionSummary_Load на:
private void SessionSummary_Load(object sender, EventArgs e)
{
summaryDataGridView.DataSource = GetSessions();
summaryDataGridView.Columns[4].DefaultCellStyle.Format = "N2";
summaryDataGridView.Columns[4].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
}
}
Надеюсь, это решит проблему, потому что entities
никогда не покидает область действия using
.