Странное исключение при использовании linq2sql
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ArgumentNullException: Value cannot be null.
Parameter name: mapping
Source Error:
Line 45: #endregion
Line 46:
Line 47: public db() :
Line 48: base(global::data.Properties.Settings.Default.nanocrmConnectionString, mappingSource)
Line 49: {
вот что я получу, если реализую такой класс:
partial class db
{
static db _db = new db();
public static db GetInstance()
{
return _db;
}
}
db - это текстовый текст linq2sql
почему это случилось и как это решить?
UPD: этот файл создан linq2sql:
private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();
public db() :
base(global::data.Properties.Settings.Default.nanocrmConnectionString, mappingSource)
{
OnCreated();
}
если я создаю экземпляр db внутри метода (а не свойства, как здесь), все работает нормально. и статический метод работал до сегодняшнего утра, но теперь даже 2 дня назад версия (восстановленная из репозитория) падает с той же ошибкой.
UPD 2:
так что это мой частичный класс после того, как проблема была решена:
namespace data
{
using System.Data.Linq.Mapping;
partial class db
{
static db _db = new db(global::data.Properties.Settings.Default.nanocrmConnectionString, new AttributeMappingSource());
public static db GetInstance()
{
return _db;
}
}
}
1 ответ
Ах, я только что посмотрел. Кажется, статическая переменная по какой-то причине не инициализирована.
На данный момент вы можете решить эту проблему, выполнив следующие действия:
static db _db = new db(
global::data.Properties.Settings.Default.nanocrmConnectionString,
new AttributeMappingSource());
Это довольно странно, хотя mappingSource
все равно будет нулевым.
Думая об этом сейчас, это может быть, как частичные классы сшиты вместе. По какой-то причине он использует ваш код в качестве "префикса" всего класса. Кажется, как и следовало ожидать, что mappingSource
не инициализируется, когда _db
инициализируется.
Дальнейшее объяснение того, что вызывает проблему.
Порядок инициализации статических членов не определен, но обычно они имеют тенденцию быть в порядке.
Возьмите следующую программу в качестве примера, чтобы еще больше усложнить ситуацию.
Main.cs
class Printer
{
public Printer(string s)
{
Console.WriteLine(s);
}
}
partial class Program
{
static void Main()
{
new Program();
Console.ReadLine();
}
}
X.cs
partial class Program
{
static Printer x = new Printer("x");
}
Y.cs
partial class Program
{
static Printer y = new Printer("y");
}
Z.cs
partial class Program
{
static Printer z = new Printer("z");
}
Теперь в зависимости от того, как подают компилятору классы, порядок инициализации может измениться.
Пытаться:
- csc Main.cs X.cs Y.cs Z.cs
- csc Main.cs Y.cs Z.cs X.cs
- csc Main.cs Y.cs X.cs Z.cs
Я подозреваю, что вы будете видеть разные результаты каждый раз.