Я искал проблему и, в отличие от популярного ответа, у меня нет представления с таким же именем класса. Здесь возникает исключение:

public async Task<Patient> AddPatientAsync(Patient newPatient)
{
    await _context.AddAsync(newPatient);
    await _context.SaveChangesAsync(); // exception

    return newPatient;
}

Метод AddAsync работает, и данные хранятся в базе данных Azure. Но метод SaveChangesAsync выдает ошибку.

Модель Patient такова:

public class Patient
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime DateOfBirth { get; set; }
    public Gender Gender { get; set; }
    public string ProtectedPin { get; set; }
    public IList<DoctorAppoint> DoctorAppoints { get; set; }
    public IList<NurseAppoint> NurseAppoints { get; set; }
    public IList<LabTest> LabTests { get; set; }
}

Вот объект newPatient в окне просмотра:

enter image description here

Вот трассировка стека:

at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityReferenceMap.Remove(Object entity, IEntityType entityType, EntityState oldState)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityReferenceMap.Update(InternalEntityEntry entry, EntityState state, Nullable`1 oldState)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.StateChanging(InternalEntityEntry entry, EntityState newState)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityState oldState, EntityState newState, Boolean acceptChanges, Boolean modifyProperties)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityState entityState, Boolean acceptChanges, Boolean modifyProperties, Nullable`1 forceStateWhenUnknownKey)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.AcceptChanges()
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.AcceptAllChanges(IReadOnlyList`1 changedEntries)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.<SaveChangesAsync>d__101.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.<ExecuteAsync>d__7`2.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at Microsoft.EntityFrameworkCore.DbContext.<SaveChangesAsync>d__54.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at EchoBot.DBModels.Repositories.PatientRepository.<AddPatientAsync>d__3.MoveNext()

Я попытался удалить и прочитать миграцию, обновление базы данных и т. Д.

1
Muzib 28 Сен 2020 в 13:14

1 ответ

Лучший ответ

Когда Entity Framework выбрасывает случайные непонятные исключения из глубины своих внутренних классов, это обычно проблема потоковой передачи. DbContext не является потокобезопасным. Вы не можете добавлять объекты из нескольких потоков.

Из комментариев:

Похоже, я забыл добавить ожидание вызова метода AddPatientAsync. Может поэтому он был многопоточным

Если вы не ждете вызова вашего AddPatientAsync() и вызываете его в цикле, несколько потоков обращаются к одному и тому же _context. Вы не можете этого сделать; жду звонка.

2
CodeCaster 28 Сен 2020 в 11:06