SQL Server принудительно преобразует nvarchar в int при вставке данных в составной кластерный первичный ключ - PullRequest
0 голосов
/ 08 марта 2019

Я создал составной первичный ключ, используя свободный API для EF Core, который создал эту таблицу:

CREATE TABLE [dbo].[Review]  
(
    [UserId]           NVARCHAR(450) NOT NULL,
    [ArticleId]        INT           NOT NULL,
    [ReviewRating]     FLOAT(53)     NOT NULL,
    [ReviewContent]    NVARCHAR(MAX) NOT NULL,
    [ReviewLastUpdate] DATETIME2(7)  NULL,
    [ReviewCreated]    DATETIME2(7)  DEFAULT (getdate()) NOT NULL,
    [ReviewVisible]    BIT           DEFAULT ((1)) NOT NULL,

    CONSTRAINT [PK_Review] 
        PRIMARY KEY CLUSTERED ([UserId] ASC, [ArticleId] ASC),
    CONSTRAINT [FK_Review_AspNetUsers_UserId] 
        FOREIGN KEY ([UserId]) 
        REFERENCES [dbo].[AspNetUsers] ([Id]) 
                ON DELETE CASCADE,
    CONSTRAINT [FK_Review_Article_ArticleId] 
        FOREIGN KEY ([ArticleId]) 
        REFERENCES [dbo].[Article] ([ArticleId]) 
                ON DELETE CASCADE
);

UserId взято из таблицы AspNetUsers, в то время как Статья является моей собственной настройкой таблицы, которая автоматически генерирует ее идентификатор.

У созданной в скаффолде страницы создания есть выпадающий список, который я заменил скрытым текстовым полем, в котором хранится значение UserId пользователя, вошедшего в систему в данный момент, и оно отправляется при отправке формы.

Но при отправке выдается исключение SQL

SqlException: преобразование завершилось неудачно при преобразовании значения nvarchar '57ed59a3-e2c9-4805-a57d-3d1ea7afed3f' в тип данных int.

57ed59a3-e2c9-4805-a57d-3d1ea7afed3f - это UserId. Даже когда я пытаюсь ввести значение напрямую, мне выдается та же ошибка.

Я даже пытался изменить его на некластеризованный, поскольку он может конфликтовать из-за 3-й причины, указанной здесь: https://docs.microsoft.com/en-us/sql/relational-databases/indexes/create-clustered-indexes?view=sql-server-2017#Restrictions

Но это не имело значения. Может кто-нибудь указать мне, что я могу сделать, чтобы решить эту ошибку?

...