2009-05-28 3 views
0

Ich habe die folgende Tabelle. Wenn ich versuche, Datensätze mit LINQ to SQL einzufügen, funktioniert es einwandfrei, bis ich versuche, einen Datensatz einzufügen, bei dem die UserId NULL ist. Wenn ich versuche, dass ich folgende FehlermeldungLINQ to SQL Verletzung der UNIQUE KEY-Einschränkung mit NULL-Spalte

„UNIQUE KEY-Einschränkung doppelte Schlüssel in Objekt nicht“

Ich bin nur leer einfügen 1 Datensatz und der Tisch bekommen versuchen, so dass es auf jeden Fall kein Zusammenstoß auf der einzigartig ist Zwang.

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) 
) 

Antwort

0

Ok das Problem war nicht wirklich die Insert-Anweisung. Es ist die Tatsache, dass ich keine Datensätze zurückgebe, wenn die UserId NULL ist und somit dieselben Datensätze wieder einfüge. Also ... SQL Server hat das Richtige getan :)

Allerdings habe ich etwas seltsames gefunden, wenn ich mit Nullwerten in LINQ umgehe. Ich hatte die folgende

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

dieser

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

Es scheint sich zu ändern, dass LINQ funktioniert nicht, wenn (int) & (int?) Miteinander vermischt werden.

1

Es scheint mehr mit der Einschränkung als mit LINQ to SQL zu tun haben. Ich bin kein Experte, aber vielleicht die UNIQUE CONSTRAINT lässt Sie NULL-Werte in diesen Feldern (Sie können keinen Nullwert in einem Primärschlüssel zum Beispiel haben)

Haben Sie versucht, eine INSERT mit einer NULL UserID von Management Studio, um zu sehen, ob das Problem in der LINQ-Seite oder der SQL Server-Seite ist? Wenn es von Management Studio aus funktioniert, versuchen Sie, die Protokollierung für LINQ zu aktivieren, und hängen Sie die tatsächliche SQL-Abfrage an, die ausgeführt wird, um die Diagnose zu erleichtern.

+0

wie u für Linq drehen sich auf der Anmeldung? Ich habe nur Express, also habe ich keinen SQL Profiler. – Alex

+0

Eine eindeutige Constraint wird Ihnen eine NULL haben, aber nur eine: http://www.sqlmag.com/Article/ArticleID/25259/sql_server_25259.html In diesem Fall sollte es mehrere NULL zulassen, aber nur innerhalb unterschiedlicher QuickViewModuleId. –

+0

@Roux: Dieser Fehler hat nichts mit der Einschränkung zu tun. In SQL Server 2005 können Sie beliebig viele Zeilen mit NULL user_ids in dieser Tabelle einfügen (ich habe es tatsächlich versucht). NULL-Werte werden von der Einschränkung ignoriert. Ich weiß nicht über 2000, und das ist ein alter Artikel, auf den Sie verweisen. – cdonner

0

Also scheitert der erste und einzige Einsatz einer NULL UserId? Sie sollten also in der Lage sein, einen einfachen Repro-Fall einzurichten und den LINQ-Code zu veröffentlichen?

0

Ich habe auch immer mit Nullwerten zu kämpfen und es wird zwischen NULL-fähigen und NULL-fähigen Typen hin und her geworfen. Es ist eine andere Frage im Zusammenhang mit FKs und NULL, dass ich bewusst bin aus, die Sie in laufen kann, wenn es darum geht, Löschungen:

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

+0

Gut zu wissen! Ich denke, dass ich wahrscheinlich trotzdem kaskadieren würde. Ich kontrolliere normalerweise auch das Datenbankende der Entwicklung. – Alex