EF Core запутался при сбросе столбцов идентификаторов, что вызвало исключениеC#

Место общения программистов C#
Ответить
Anonymous
 EF Core запутался при сбросе столбцов идентификаторов, что вызвало исключение

Сообщение Anonymous »

Это мой метод заполнения:

Код: Выделить всё

public async Task Seed()
{
dbContext.Database.Migrate();

string dbName = dbContext.Database.GetDbConnection().Database;

if (!dbName.EndsWith("_Tests"))
{
var tableNames = dbContext.Model.GetEntityTypes()
.Select(t => t.GetTableName())
.Distinct()
.ToList();

tableNames.ForEach(tableName =>
{
dbContext.Database.ExecuteSqlRaw($"ALTER TABLE {tableName} NOCHECK CONSTRAINT ALL;");
});

tableNames.ForEach(tableName =>
{
dbContext.Database.ExecuteSqlRaw($"DELETE FROM {tableName};");
dbContext.Database.ExecuteSqlRaw(
$"IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID('{tableName}') AND is_identity = 1) " +
$"BEGIN DBCC CHECKIDENT ('{tableName}', RESEED, 0); END");
});

tableNames.ForEach(tableName =>
{
dbContext.Database.ExecuteSqlRaw($"ALTER TABLE {tableName} CHECK CONSTRAINT ALL;");
});

//Seed/insert data
await SeedTable1();
await SeedTable2();  // Depends on 1 for FK
await SeedTable3(); // Depends on 1 and 2 for FK
}
}
Все работало нормально, пока я не добавил эту строку:

Код: Выделить всё

dbContext.Database.ExecuteSqlRaw(
$"IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID('{tableName}') AND is_identity = 1) " +
$"BEGIN DBCC CHECKIDENT ('{tableName}', RESEED, 0); END");
Эта строка сбрасывает столбцы идентификаторов в базе данных, поэтому при каждом перезапуске разработки вставленные элементы начинаются с PK = 1.
Однако из-за этой строки Я получаю ошибки в своих функциях заполнения SeedTable2/3, которые имеют внешние ключи.
Выдает следующую ошибку:

Значение CustomOptionMachineCategory (Dictionary).AllowedOptionsId» неизвестно при попытке сохранить изменения. Это связано с тем, что свойство также является частью внешнего ключа, для которого основная сущность в связи неизвестна.

Это ограничение FK, поэтому Я попытался добавить следующее после вставки данных/заполнения.

Код: Выделить всё

tableNames.ForEach(tableName =>
{
dbContext.Database.ExecuteSqlRaw($"ALTER TABLE {tableName} CHECK CONSTRAINT ALL;");
});
Но ошибка по-прежнему продолжает появляться.
Я должен отметить одну вещь: эта ошибка возникает только тогда, когда база данных была недавно удалена, и он запускается с первого раза. После этого ошибок больше не возникает.
Очень странно.
  • Удалить БД.
    Удалите строку Database.Migrate, чтобы она не мигрировала.
  • Запустите миграцию вручную с помощью команды.
  • Результаты ошибка
  • Начать заново
  • Работает
ИЛИ
  • Удалить БД.
  • RUN
  • Ошибка
  • Начни заново
  • Работает
Поэтому я не знаю, думаю, это связано с исходное состояние базы данных, которой не нравится сброс идентификатора.
Похоже, что каждый раз, когда выполняется ОЖИДАЮЩАЯ миграция, у которой есть соответствующее начальное значение с fk, либо вручную, либо через Database.Migrate< /code> возникает ошибка.
Что я могу сделать, чтобы это исправить?

Подробнее здесь: https://stackoverflow.com/questions/791 ... -exception
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»