2009-05-28 84 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代码?

相关问题