LINQ to SQL Нарушение ограничения UNIQUE KEY со столбцом NULL - PullRequest
0 голосов
/ 28 мая 2009

У меня есть следующая таблица. Когда я пытаюсь вставить записи, используя LINQ to SQL, все работает нормально, пока я не попытаюсь вставить запись, где UserId равен нулю. Когда я пытаюсь это сделать, я получаю следующую ошибку

«Ограничение 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 ]

1 голос
/ 28 мая 2009

Кажется, это больше связано с самим ограничением, чем с LINQ to SQL. Я не эксперт, но, возможно, UNIQUE CONSTRAINT не позволит вам иметь значения NULL в этих полях (например, вы не можете иметь нулевое значение в первичном ключе)

Вы пытались выполнить INSERT с NULL UserID из Management Studio, чтобы увидеть, связана ли проблема со стороной LINQ или со стороны SQL Server? Кроме того, если это работает из Management Studio, попробуйте включить ведение журнала для LINQ и добавить фактический выполняемый запрос SQL, что поможет в диагностике.

0 голосов
/ 28 мая 2009

Я тоже всегда борюсь с нулевыми значениями, и в конечном итоге бросаю туда и обратно между обнуляемым и необнуляемым типами Есть еще одна проблема, связанная с FK и NULL, о которой я знаю, с которой вы можете столкнуться при удалении:

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

0 голосов
/ 28 мая 2009

Хорошо, проблема была не в операторе вставки. Дело в том, что я не возвращаю никаких записей, когда 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();
}

Кажется, что LINQ не работает, когда (int) и (int?) Смешаны вместе.

0 голосов
/ 28 мая 2009

То есть первая и единственная вставка NULL UserId не удалась? Таким образом, вы должны иметь возможность настроить простой случай воспроизведения и опубликовать код LINQ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...