Я искал проблему и, в отличие от популярного ответа, у меня нет представления с таким же именем класса. Здесь возникает исключение:
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
в окне просмотра:
Вот трассировка стека:
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 ответ
Когда Entity Framework выбрасывает случайные непонятные исключения из глубины своих внутренних классов, это обычно проблема потоковой передачи. DbContext не является потокобезопасным. Вы не можете добавлять объекты из нескольких потоков.
Из комментариев:
Похоже, я забыл добавить ожидание вызова метода AddPatientAsync. Может поэтому он был многопоточным
Если вы не ждете вызова вашего AddPatientAsync()
и вызываете его в цикле, несколько потоков обращаются к одному и тому же _context
. Вы не можете этого сделать; жду звонка.
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.