Приветсвую,
В многопотоковом приложении периодически бросается исключение '
InvalidOperationException {"Нулевой объект должен иметь значение."}' в методе '
LinqMetadataProvider.IsLinqObject' на строчке 36:
return _isLinqObject.Value;
DbManager создается создается в каждом потоке и имеет минимальное время жизни ограниченное выполнением запроса к БД, т.е. использование DbManager из разных потоков отсутствует.
Просмотрев бегло код, вроде как
MetadataProviderList является глобальным объектом и если это так, то подобные коллизии должны возникать периодически для всех
MetadataProviderBase'ов.
Ниже часть кода из
LinqMetadataProvider относящаяся к описанной проблеме:
private void EnsureMapper(Type type)
{
if (_type != type)
{
_type = type;
_isLinqObject = null;
}
}
private bool IsLinqObject(Type type)
{
EnsureMapper(type);
if (_isLinqObject == null)
{
var attrs = type.GetCustomAttributes(typeof(TableAttribute), true);
_isLinqObject = attrs.Length > 0;
}
return _isLinqObject.Value;
}
Обратите внимание на
выделенные строчки. Если вызов 'IsLinqObject' не синхронизован, то вполне вероятна ситуация когда
_isLinqObject действительно null.
Предполагаю, что синхронизация на уровне
IsLinqObject это частный случай (хотя и работает в моей конкретной ситуации) и возможно имеет смысл рассмотреть более общую проблему использования глобальных объектов в многопоточной среде.