LINQ to SQL违反带有NULL列的UNIQUE KEY约束

时间:2009-05-28 02:43:21

标签: .net sql-server linq-to-sql

我有下表。当我尝试使用LINQ to SQL插入记录时,它工作正常,直到我尝试插入UserId为null的记录。当我尝试时,我收到以下错误

“UNIQUE KEY约束无法在对象中插入重复键”

我只是尝试插入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)
)

4 个答案:

答案 0 :(得分:1)

与LINQ to SQL相比,似乎更多地与约束本身有关。 我不是专家,但也许UNIQUE CONSTRAINT不会让你在这些字段中有NULL值(例如,你不能在主键中有空值)

您是否尝试使用Management Studio中的NULL UserID进行INSERT,以查看问题是在LINQ端还是在SQL Server端? 此外,如果它在Management Studio中运行,请尝试打开LINQ的日志记录,并附加正在运行的实际SQL查询,这将有助于诊断。

答案 1 :(得分:0)

那么NULL UserId的第一个也是唯一一个插入失败了吗?那么你应该能够设置一个简单的repro case并发布LINQ代码吗?

答案 2 :(得分:0)

好的问题实际上不是insert语句。事实上,当UserId为NULL并且因此再次插入相同的记录时,我没有返回任何记录。所以...... SQL服务器正在做正确的事情:)

然而,在LINQ中处理null值时,我发现了一些奇怪的东西。我不得不改变以下

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();
}

似乎LINQ在(int)& (int?)混合在一起。

答案 3 :(得分:0)

我也总是在努力处理空值,并最终在可空和非可空类型之间来回转换。还有一个与FK和NULL相关的问题,我知道这个问题,在删除时可能遇到这个问题:

http://blogs.msdn.com/bethmassi/archive/2007/10/02/linq-to-sql-and-one-to-many-relationships.aspx