2009-05-28 82 views
0

我有下表。當我嘗試插入記錄使用LINQ到SQL它工作正常,直到我嘗試插入UserId爲空的記錄。當我嘗試,我得到以下錯誤LINQ to SQL違反UNIQUE KEY約束與NULL列

「唯一鍵約束不能在對象中插入重複鍵」

我只是想插入1條記錄,該表是空的,所以有得天獨厚的肯定沒衝突約束。

CREATE TABLE [dbo].[QuickViewUserModule](
    [QuickViewUserModuleId] [int] IDENTITY(1,1) NOT NULL, 
    [QuickViewModuleId] [int] NOT NULL, 
    [UserId] [int] NULL, 
    [SortOrder] [tinyint] NOT NULL, 
... More key stuff ... 
    CONSTRAINT [IX_QuickViewUserModule] UNIQUE NONCLUSTERED ( 
     [UserId] ASC, 
     [QuickViewModuleId] ASC) 
) 

回答

0

好吧,問題實際上不是插入語句。這是事實,我沒有返回任何記錄時,UserId爲NULL,並因此再次插入相同的記錄。所以...... SQL服務器正在做正確的事情:)

然而,我發現一些奇怪的東西,當處理空值在LINQ。我有以下

return (from dm in Context.DesktopModules 
     join qvu in Context.QuickViewUserModules on dm.DesktopModuleID equals qvu.QuickViewModuleId 
     where qvu.UserId == (userId == Null.NullInteger ? null : (int ?)userId) 
     orderby qvu.SortOrder, dm.ModuleName ascending 
     select dm).ToList(); 

改變這種

if(userId == Null.NullInteger) 
{ 
    return (from dm in Context.DesktopModules 
     join qvu in Context.QuickViewUserModules on dm.DesktopModuleID equals qvu.QuickViewModuleId 
     where qvu.UserId == null 
     orderby qvu.SortOrder, dm.ModuleName ascending 
     select dm).ToList(); 
} 
else 
{ 
    return (from dm in Context.DesktopModules 
     join qvu in Context.QuickViewUserModules on dm.DesktopModuleID equals qvu.QuickViewModuleId 
     where qvu.UserId == userId 
     orderby qvu.SortOrder, dm.ModuleName ascending 
     select dm).ToList(); 
} 

看來,當(INT)&(INT?)混合在一起LINQ不起作用。

1

它似乎有更多的關於約束本身比與LINQ to SQL。 我不是專家,但也許唯一約束不會讓你有NULL值在這些領域(例如,你不能在一個主鍵爲空值)

你試過做一個INSERT用Management Studio的NULL用戶ID來查看問題出在LINQ端還是SQL Server端? 另外,如果它從Management Studio運行,請嘗試啓用LINQ的日誌記錄,並追加正在運行的實際SQL查詢,這將有助於診斷。

+0

您是如何打開日誌記錄LINQ?我只有快遞,所以我沒有SQL分析器。 – Alex 2009-05-28 02:53:31

+0

一個唯一的約束將讓你有一個NULL,但只有一個:http://www.sqlmag.com/Article/ArticleID/25259/sql_server_25259.html在這種情況下,它應該允許多個NULL,但只能在不同的QuickViewModuleId內。 – 2009-05-28 02:53:36

0

因此NULL UserId的第一個也是唯一的插入失敗了?所以你應該能夠建立一個簡單的repro例子併發布LINQ代碼?

相關問題