Индекс многостолбцовой структуры Entity Framework - Невозможно вставить повторяющуюся строку ключа в объект - PullRequest
0 голосов
/ 17 октября 2019

Произошла ошибка при запуске сценария базы данных create + seed.

Невозможно вставить строку повторяющегося ключа в объект 'dbo.ResourceCategories' с уникальным индексом 'IX_UniqueResCatName'. Значение дублированного ключа (DSC20, DST20).

Это происходит в первой строке, которую я пытаюсь заполнить, но база данных определенно была отброшена и уничтожена.

My ResouceCategory.cs файл настроен так, чтобы иметь уникальный индекс из 2 элементов, как обсуждено здесь

[MinLength(1), MaxLength(5)]
[Index("IX_UniqueResCatName", 1, IsUnique = true)]
public string Name { get; set; }

[MaxLength(50)]
[Index("IX_UniqueResCatName", 2, IsUnique = true)]
public string Description { get; set; }

Я автоматически сгенерировал Миграции для этого (который выполняется перед заполнением), исоответствующая часть выглядит как

CREATE UNIQUE INDEX [IX_UniqueResCatName] 
ON [dbo].[ResourceCategories] ([Name], [Description])

И выдержка из начального SQL (запускается автоматически из сценария bash):

INSERT INTO [dbo].[ResourceCategories] ([Id], [Description], [Name], [IsActive], [CreatedByUser], [CreatedOn], [LastUpdatedByUser], [LastUpdatedOn]) 
VALUES (NEWID(), 'DST20', 'DSC20', 1, 'system', GETDATE(), 'system', GETDATE())

INSERT INTO [dbo].[ResourceCategories] ([Id], [Description], [Name], [IsActive],[CreatedByUser], [CreatedOn], [LastUpdatedByUser], [LastUpdatedOn]) 
VALUES (NEWID(), 'EPT10', 'EPC10', 1, 'system', GETDATE(), 'system', GETDATE())

INSERT INTO [dbo].[ResourceCategories] ([Id], [Description], [Name], [IsActive],[CreatedByUser], [CreatedOn], [LastUpdatedByUser], [LastUpdatedOn]) 
VALUES (NEWID(), 'EPT10', 'EPC11', 1, 'system', GETDATE(), 'system', GETDATE())

INSERT INTO [dbo].[ResourceCategories] ([Id], [Description], [Name], [IsActive], [CreatedByUser], [CreatedOn], [LastUpdatedByUser], [LastUpdatedOn])  
VALUES (NEWID(), 'EPT10', 'EPC12', 1, 'system', GETDATE(), 'system', GETDATE())

1 Ответ

1 голос
/ 17 октября 2019

Проблема заключалась в том, что мой сценарий Create + Seed запускал seed дважды, и ошибки по праву возникали во втором запуске.

Я запустил его как CreateDatabases.cmd dev localhost SeedData.sql, но он был разработан, чтобы всегда запускатьсяSeedData.sql и при желании запустить любой 3-й аргумент. Поскольку я передавал «SeedData.sql» (а не «SeedData_Stress.sql», например), он выполнялся дважды.

Я изменил скрипт, чтобы игнорировать 3-й аргумент, если он был "SeedData.sql":

set Seed=true
if not '%3' == '' (
    if '%3' == 'SeedData.sql' ( :: This file will run automatically no matter what, so don't re-run it if it's accidentally passed in
        set Seed=false
    ) else (
        set SeedData=%3
    )
) else (
    set Seed=false
)

...

if %Seed% == true (
    echo Adding seed data...
    sqlcmd -S %targetServer% -d nexus -E -b -i "%SeedData%"
) ELSE (
    echo No additional seed data being added...
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...