在LINQPad中调用带有数据上下文的静态方法

本文关键字:数据 上下文 静态方法 LINQPad 调用 | 更新日期: 2023-09-27 17:49:38

我正在使用LINQPad开发一种新的数据访问方法。在对MySchemaContext中的表执行LINQ-to-SQL查询的方法中,我使用了一个参数,我使用静态方法从相同的DataContext对象中为该参数加载默认值。

当我在LINQPad中调用这个静态函数时(使用"c# Program"设置)——一个在应用程序中调用时工作良好的函数,并且它是公共的——我在将静态函数的返回值分配给变量的行中得到一个空引用异常。如果我改变函数的逻辑,如果我不引用MySchemaContext(例如,如果我手工组装List并返回List),它就会工作,但是如果我引用MySchemaContext则会抛出异常。

我的猜测是,这与LINQPad连接到我的数据库的方式有关-当从LINQPad调用库函数时,DataContext无效,并且null引用异常是由库中的GetTable<MyClassTable>抛出的。这是LINQPad的限制,还是我遗漏了一些明显的东西?

下面是我遇到问题的那种函数的一个示例。第一部分是我的库中的代码(我从LINQPad查询调用):

namespace MyLibrary
{
 public class MyClass : MyClassTable
 {
   //There are reasons not to just add stuff to the partial class MyClassTable 
   //that aren't shown in this generic example
  public int MyClassTemplateID {get; set;}
  public int MyInt {get; set;}
  public string MyString {get; set;}
  public MyClass() {}
  public MyClass(int myClassTemplateID, int myInt, string myString) 
  {
   MyClassTemplateID = myClassTemplateID;
   MyInt = myInt;
   MyString = myString;
  }
  public static List<MyClass> GetMyClassesTemplate(int myClassTemplateID)
  {
   //MySchemaContext is a LINQ-to-SQL DataContext object, i.e., inherits from System.Data.Linq.DataContext 
   using (MySchemaContext myContext = new MySchemaContext())
   {
    return (from mct in myContext.GetTable<MyClassTable>().AsQueryable() 
     where mct.MyClassTemplateID == myClassTemplateID 
     select new MyClass
     {
      MyClassTemplateID = mct.MyClassTemplateID,
      MyInt = mct.MyInt,
      MyString = mct.MyString
     }).ToList<MyClass>();
   }
  }
 }
}

库函数在我的应用程序中运行良好。第二部分是在我的LINQPad查询中,尝试调用相同的函数:

/*
    Call from LINQPad
    MyLibrary.dll is in "Additional References," and MyLibrary is in "Additional Namespace Imports."
*/
void Main()
{
 List<MyClass> myClassList = MyClass.GetMyClassesTemplate(1);
 //get error "NullReferenceException: Object reference not set to an instance of an object.
 //However, this exact line of code works fine in VisualStudio.
 //Have correct connection string for MySchemaContext in LINQPad.exe.config and lprun.exe.config
}

在LINQPad中调用带有数据上下文的静态方法

我怀疑您的问题是使用单独的名称空间。我能够使用以下代码访问LINQPad中的静态方法。特别注意左括号和右括号的不匹配。

    void Main()
    {
        tName.test.DoIt(); // Fully qualify the static method name
    }
} // Close the generated context's class
namespace tName
{
    public class test
    {
    // Define other methods and classes here
        public static void DoIt()
        {
            Console.WriteLine("Done");
        }
    }
// } Don't close the namespace. Let LinqPad do it.

使用LinqPad,您实际上是将您键入的代码注入生成的上下文中。因此,在注入新的名称空间/类之前,您需要假定上下文的类是关闭的。如果不使用名称空间,则可以创建一个新类,但是该类将是托管类的子类,而不是直接在所讨论的名称空间下。