我有下表。当我尝试使用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)
)
答案 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