使用linq2sql时出现奇怪的异常

时间:2010-04-14 04:54:39

标签: .net linq-to-sql static-initializer

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 datacontext

为什么要这样做?以及如何解决这个问题?

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 :(得分:0)

啊,我刚看了一眼。似乎静态变量由于某种原因没有初始化。

现在您可以通过执行以下操作来解决问题:

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

我怀疑你每次都会看到不同的结果。