Странное исключение при использовании linq2sql - PullRequest
1 голос
/ 14 апреля 2010
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;
    }
}

дБ - текстовый текст 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 Ответ

0 голосов
/ 14 апреля 2010

Ах, я только что посмотрел.Кажется, статическая переменная по какой-то причине не инициализирована.

Пока вы можете решить эту проблему, выполнив следующее:

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");
  }

Теперь, в зависимости от способа подачи компилятором классов, порядок инициализации может измениться.

Try:

  • 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

Я подозреваю, что вы будете видеть разные результаты каждый раз.

...