1
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 日前のバージョン (リポジトリから復元されたもの) でも同じエラーが発生します。

更新 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;
    }
}
}
4

1 に答える 1

0

あ、ちょっと見てきた。何らかの理由で静的変数が初期化されていないようです。

今のところ、次の手順で問題を解決できます。

static db _db = new db(
 global::data.Properties.Settings.Default.nanocrmConnectionString, 
 new AttributeMappingSource());

mappingSourceそれでもnullになるのはかなり奇妙です。

今考えてみると、部分クラスをつなぎ合わせる方法かもしれません。何らかの理由で、コードをクラス全体の「プレフィックス」として使用します。予想通り、が初期化されている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

毎回異なる結果が表示されると思います。

于 2010-04-14T05:01:19.857 に答える