2009-05-28 10 views
0

次の表があります。 LINQを使用してSQLにレコードを挿入しようとすると、UserIdがnullのレコードを挿入しようとするまでうまく動作します。私は次のエラーを取得することをしようとするとユニークに間違いなく何の衝突がないので、LINQ to SQL NULL列のUNIQUE KEY制約違反

は、私が唯一の1つのレコードを挿入しようとしています

「UNIQUE KEY制約は、オブジェクト内の重複するキーを挿入できません」と表は空です制約。

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

[OK]問題は実際には挿入ステートメントではありませんでした。 UserIdがNULLで同じレコードを再度挿入すると、レコードが返されないという事実がありました。だから... SQLサーバーは正しいことをしていた:)

しかし、何か私は奇妙なLINQでnull値を扱うときに何かを発見した。私は(int型)&(int型は?)一緒に混合されたときにLINQが動作しないようです。この

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

に次の

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

を変更しなければなりませんでした。

1

LINQ to SQLの場合よりも制約自体が多く関係しているようです。 私は専門家ではありませんが、UNIQUE CONSTRAINTはこれらのフィールドにNULL値を持たせることはできません(たとえば、主キーにNULL値を設定することはできません)。

INSERT Management StudioのNULL UserIDを使用して、問題がLINQ側にあるのか、SQL Server側にあるのかを確認します。 また、Management Studioから機能する場合は、LINQのログを有効にして、実行中の実際のSQLクエリを追加してください。これにより、診断に役立ちます。

+0

どのようにuはLINQのロギングをオンにしますか:あなたはそれを削除に来るときに実行することがあり、私はオフ承知FKSとNULLに関連する1つの他の問題がありますか?私はエクスプレスしか持っていないので、私はSQLプロファイラを持っていません。 – Alex

+0

UNIQUE CONSTRAINTを使用するとNULLは1つのみです。http://www.sqlmag.com/Article/ArticleID/25259/sql_server_25259.htmlこの場合、複数のNULLを許可する必要がありますが、異なるQuickViewModuleId内でのみ可能です。 –

+0

@Roux:このエラーは制約とは関係ありません。 SQL Server 2005では、好きなようにこのテーブルにNULL user_idsを持つ行をいくつでも挿入できます(実際に試しました)。 NULL値は制約によって無視されます。私は2000年を知らないし、これはあなたが参照している古い記事です。 – cdonner

0

NULL UserIdの最初の唯一の挿入が失敗しますか? LINQコードを投稿すれば簡単な復習ケースを設定できるはずです。

関連する問題