Сейчас я пытаюсь переместить базу данных MySQL с помощью Entity Framework. Для начала я выбираю небольшую таблицу, состоящую всего из 8 строк, но когда я добавляю ее в свой DbContext и сохраняю, возникает ошибка, сообщающая о нарушении дублированного ключа.
Я проверил записи и обнаружил, что все они имеют уникальные идентификаторы (0–7).
Вот мой код:
static void Main(string[] args) { СоздатьБД(); ЗагрузитьПромышленныеГруппы(); } статическая пустота LoadIndustryGroups() { результат вар = RemoteController.OpenDatabase(); вар ig = RemoteController.GetAllIndustryGroups().Result; foreach (группа var в ig) { Console.WriteLine($"{group.industrygroupID} {group.Description} {group.Notes}"); } используя (var context = новый J1939DbContext()) { context.Database.EnsureCreated(); foreach (группа var в ig) { context.Entry(group).State = EntityState.Detached; } context.IndustryGroups.AddRange(ig); пытаться { context.SaveChanges(); } поймать (Исключение ex) { Console.WriteLine(ex); } } } Вот как выглядит мой DbContext:
публичный класс J1939DbContext: DbContext { статическая строка только для чтения ConnectionString = "Сервер=localhost; Идентификатор пользователя=x; Пароль=x; База данных=test_db; Порт=3307"; общественный DbSet IndustryGroups {get; набор; } защищенное переопределение void OnConfiguring (DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)); optionsBuilder.EnableSensitiveDataLogging(истина); } защищенное переопределение void OnModelCreating (ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity(entity => { entity.HasKey(e => e.industrygroupID); entity.Property(e => e.Notes); entity.Property(e => e.Description); entity.Property(e => e.Revised); }); } } Сообщение об ошибке:
Microsoft.EntityFrameworkCore.DbUpdateException: произошла ошибка при сохранении изменений сущности. Подробности смотрите во внутреннем исключении.
System.InvalidOperationException: экземпляр типа сущности «IndustryGroup» невозможно отследить, поскольку другой экземпляр со значением ключа «{industrygroupID: 2}» уже отслеживается. При присоединении существующих сущностей убедитесь, что присоединен только один экземпляр сущности с заданным значением ключа.
в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap`1.ThrowIdentityConflict (запись InternalEntityEntry) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap`1.Add (ключ TKey, запись InternalEntityEntry, логическое updateDuulate) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.NavigationFixer.KeyPropertyChanged (запись InternalEntityEntry, свойство IProperty, IEnumerable`1, содержащийPrincipalKeys, IEnumerable`1, содержащийForeignKeys, Object oldValue, Object newValue) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.ChangeDetector.DetectKeyChange (запись InternalEntityEntry, свойство IProperty) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.ChangeDetector.PropertyChanged (запись InternalEntityEntry, IPropertyBase propertyBase, логическое значение setModified) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetProperty(IPPropertyBase propertyBase, значение объекта, логическое значение isMaterialization, логическое значение setModified, логическое значение isCascadeDelete, CurrentValueType valueType) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetStoreGeneratedValue (свойство IProperty, значение объекта, логическое значение setModified) в Microsoft.EntityFrameworkCore.Update.ColumnModification.set_Value (значение объекта) в Pomelo.EntityFrameworkCore.MySql.Update.Internal.MySqlModificationCommand.PropagateResults(RelationalDataReaderrelationalReader) в Pomelo.EntityFrameworkCore.MySql.Update.Internal.MySqlModificationCommandBatch.ConsumeResultSet(Int32 startCommandIndex, средство чтения RelationalDataReader) в Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.Consume (читатель RelationalDataReader) --- Конец внутренней трассировки стека исключений --- в Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.Consume (читатель RelationalDataReader) в Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute (соединение IRelationalConnection) в Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute (командный пакет IEnumerable`1, соединение IRelationalConnection) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges (IList`1 elementsToSave) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(StateManager stateManager, логическое значение AcceptAllChangesOnSuccess) в Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.Execute[TState,TResult](состояние TState, операция Func`3, Func`3verifySucceeded) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(логическое значение AcceptAllChangesOnSuccess) в Microsoft.EntityFrameworkCore.DbContext.SaveChanges(логическое значение AcceptAllChangesOnSuccess) в EfTest.Program.LoadIndustryGroups() в E:\J1939_DB\Source\EfTest\Program.cs:строка 43 Вот как таблицы выглядят в старой базе данных и я проверил, что они загружены правильно:

Я попробовал дать им разные идентификаторы (старый идентификатор + 1000), и это действительно сработало. Однако мне не разрешено изменять данные, поэтому это недопустимое решение.