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, либо вручную, либо через базу данных. При миграции возникает ошибка.
Что я могу сделать, чтобы это исправить?

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

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

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

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

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

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