2008-10-08 82 views
1

我在我的LinqToSql模型上有一個非常有趣的問題。在我的一些表格中,我有對其他表格的引用,而在LinqToSql中,這是由EnitiyRef類表示的,當您嘗試訪問引用表格時,LinqToSql將從數據庫加載引用。LinqToSql引用的實體會拋出NullReferenceException

在我的開發機器上一切正常(引用加載完美),但昨天晚上我將修改上傳到我們的生產服務器,並嘗試訪問我的表上的引用時,開始獲取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文件到我的服務器,以便其完全相同的架構)

+0

因此它被編譯在你的機器上,編譯好的程序在你的機器上運行正常,但是在生產服務器上崩潰了? (意思是你使用相同的二進制文件,或者只是來自同一個源文件) – Sam 2008-10-08 13:22:42

+0

相同的二進制文件,所有東西都在我的盒子上編譯。 – 2008-10-08 13:34:57

回答

2

您是否已經開啓了上下文登錄功能,並將開箱上的結果與生產箱上的結果進行了比較?

+0

感謝您的回答。上下文的確顯示了一件事情,即AttributedMetaModel在服務器上有不同版本,然後在我的機器上,結果發現系統管理員安裝了3.0 SP1而不是3.5 SP1。有多混淆(以及如何跛腳)。不管怎麼說,還是要謝謝你。 – 2008-10-12 15:29:48

1

如果您將源代碼移動到生產服務器並在那裏編譯,請嘗試重新生成DataContext生成的源代碼。您可以通過從DataContext源文件的上下文菜單中運行「運行用戶定義的工具」來執行此操作。

如果兩者共享相同的二進制文件,請確保兩個數據庫中的數據庫定義完全相同。像生產服務器上的一列可以空,但在開發者箱上不可空的小差異可以使所有不同。

+0

更新了問題以澄清此問題。 – 2008-10-08 14:19:16

1

爲了找到並解決這樣的問題,它可能會有助於堆棧跟蹤和可能的數據庫分析。

這個問題可能是一個安全問題。您是否嘗試在應用程序使用的Management Studio中使用相同的憑據進行登錄,並在表上進行選擇。

這至少會給你一個安全或linq問題的想法。

+0

正在使用的用戶是數據庫的所有者。 Sql profiler不會顯示除主表(銷售)以外的任何流量 – 2008-10-08 14:18:06

0

檢查DataContext生存期。有可能是過時的緩存在這裏

工作例如:

  1. CONTEXT1:負載銷售與ID == 1,檢查其用戶的財產,遵守null用戶。
  2. 上下文2:使用ID == 1.加載銷售通過添加新用戶來修改用戶屬性。承諾。
  3. 上下文1:使用ID == 1.加載銷售檢查其用戶屬性。是的,仍然是空的(它被緩存!!)。
0

一種可能性是您的DBML使用的連接字符串仍然指向生產以外的數據庫服務器。

LinqDataSource在ASPX頁面中直接使用時發生了這種情況,因此DataContext使用默認構造函數,該構造函數指向基於最後一位開發人員用於導入DBML的數據庫的連接字符串。

我們所做的是創建一個DataContext對象,該對象從生成的DataContext繼承,並使用來自web.config的正確連接字符串覆蓋默認構造函數。

相關問題