LinqToSql引用的实体将抛出NullReferenceException

时间:2008-10-08 13:14:27

标签: c# .net sql database linq

我的LinqToSql模型上有一个非常有趣的问题。在我的一些表中,我有一个对其他表的引用,在LinqToSql中,它由EnitiyRef类表示,当您尝试访问引用表时,LinqToSql将从数据库加载引用。

在我的开发机器上一切正常(引用完全加载)但昨晚我将更改上传到我们的生产服务器并在尝试访问我的表格上的引用时开始获取NullReferenceExceptions。

示例代码:

var sale = db.Sales.Single(s => s.ID == 1);
string username = sale.User.Name;    // User is a reference to a User table
                                     // LinqToSql will automatically load the
                                     // row and access the fields i need.

// On my server the sale.User throws an exception that its null (User) but the user
// is definitly in the database (there is even a FK constraint from Sale to User)

起初我认为我的DataContext得到了GC'd,但我仔细检查了一切没有结果(除了它在我的盒子上工作)。

(服务器和我的盒子上的一切都是一样的,同样的dll,相同的数据库架构等......) (我实际上将整个DBF文件复制到我的服务器上,因此它的模式完全相同)

5 个答案:

答案 0 :(得分:2)

您是否已启用上下文登录并将开发框中的结果与生产框上的结果进行比较?

答案 1 :(得分:1)

如果将源移动到生产服务器并在那里进行编译,请尝试重新生成DataContext的生成源。您可以通过从DataContext源文件的上下文菜单中运行“运行用户定义的工具”来执行此操作。

如果两者共享相同的二进制文件,请确保两个数据库中的数据库定义完全相同。像生产服务器上的一列可以为空但在devbox上无法为空的小差异可能会有所不同。

答案 2 :(得分:1)

为了找到并解决这样的问题,对堆栈跟踪和数据库进行概要分析会有所帮助。

问题可能是一个安全问题。您是否尝试使用管理工作室中的相同凭据登录,并在桌面上执行选择。

这至少会让你对安全性或linq问题有所了解。

答案 3 :(得分:0)

检查DataContext生命周期。这里可能有陈旧的缓存

例如:

  1. Context1:使用ID == 1加载销售。检查其User属性并观察null User。
  2. Context2:使用ID == 1加载销售。通过添加新用户修改用户属性。提交。
  3. Context1:加载销售ID == 1.检查其用户属性。是的,仍然是空的(它被缓存!!)。

答案 4 :(得分:0)

一种可能性是您的DBML使用的连接字符串仍然指向除Production之外的数据库服务器。

只要在ASPX页面中直接使用LinqDataSource,就会发生这种情况,因此DataContext使用默认构造函数,该构造函数指向基于最后一个开发人员用于导入DBML的数据库的连接字符串。 / p>

我们所做的是创建一个DataContext对象,该对象继承自生成的DataContext,并使用来自web.config的正确连接字符串覆盖默认构造函数。

相关问题