Pergunta

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:        {

É isso que recebo se implementar essa classe:

partial class db
{
    static db _db = new db();

    public static db GetInstance()
    {
        return _db;
    }
}

DB é um datacontext Linq2SQL

Por que isso ocorreu e como resolver isso?

Up: Esse arquivo é gerado por Linq2SQL:

    private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();

    public db() : 
            base(global::data.Properties.Settings.Default.nanocrmConnectionString, mappingSource)
    {
        OnCreated();
    }

Se eu instanciar o método interno do banco de dados (não propriedade como aqui), tudo funcionará bem. E o método estático funcionou até esta manhã, mas agora até 2 dias atrás (restaurado do repositório) cai com o mesmo erro.

UPD 2:

Portanto, esta é minha aula parcial após a resolução do problema:

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;
    }
}
}
Foi útil?

Solução

Ah, eu só dei uma olhada. Parece que a variável estática não é inicializada por algum motivo.

Por enquanto você pode resolver o problema fazendo o seguinte:

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

É bastante estranho que mappingSource ainda seria nulo.

Pensando nisso agora, pode ser como as aulas parciais são costuradas. Por algum motivo, ele usa seu código como o 'prefixo' de toda a classe. Parece, como eu esperaria, que mappingSource não é inicializado quando _db está sendo inicializado.

Uma explicação adicional do que está causando o problema.

A ordem de inicialização dos membros estáticos é indefinida, mas geralmente tendem a estar em ordem.

Tome o programa a seguir como um exemplo para complicar ainda mais as coisas.

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

Agora, dependendo de como alimentar o compilador as classes, a ordem de inicialização pode mudar.

Tentar:

  • 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

Eu suspeito que você verá resultados diferentes todas as vezes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top