EF Core | Добавление связанной сущности | Ожидалось, что операция базы данных повлияет на 1 строку(и), но на самом деле C#

Место общения программистов C#
Anonymous
EF Core | Добавление связанной сущности | Ожидалось, что операция базы данных повлияет на 1 строку(и), но на самом деле

Сообщение Anonymous »

Не могу понять, почему появляется следующая ошибка:
{
"title": "Server Error",
"status": 500,
"detail": "The database operation was expected to affect 1 row(s), but actually affected 0 row(s); data may have been modified or deleted since entities were loaded. See https://go.microsoft.com/fwlink/?LinkId=527962 for information on understanding and handling optimistic concurrency exceptions."
}

Я единственный, кто тестирует в локальной среде. Я работал в соответствии с документацией здесь
Код вроде бы тоже на месте, но я наверняка что-то упускаю. Обратите внимание, что я упростил код, удалив проверку и т. д.
У меня есть две сущности:
public class Tutor : Entity, IAggregateRoot
{
public Guid Id { get; private set; }
public string FirstName { get; private set; }
public string LastName { get; private set; }
public ICollection Availabilities { get; private set; }

public Tutor(string firstName, string lastName)
{
this.Id = Guid.NewGuid();
this.FirstName = firstName;
this.LastName = lastName;
this.Availabilities = [];
}

public static Tutor Create(string firstName, string lastName)
{
return new Tutor(firstName, lastName);
}

public Availability AddAvailability(DateTime startDateTime, DateTime endDateTime, bool recurring)
{
Availability availability = new(this.Id, startDateTime, endDateTime, recurring);
this.Availabilities.Add(availability);
return availability;
}
}

И:
public class Availability : Entity
{
public Guid Id { get; private set; }
public Guid TutorId { get; private set; }
public Tutor Tutor { get; private set; }
public DateTime StartDateTime { get; private set; }
public DateTime EndDateTime { get; private set; }
public bool Recurring { get; private set; }

public Availability(Guid tutorId, DateTime startDateTime, DateTime endDateTime, bool recurring)
{
this.Id = Guid.NewGuid();
this.TutorId = tutorId;
this.StartDateTime = startDateTime;
this.EndDateTime = endDateTime;
this.Recurring = recurring;
}
}

Это конфигурация объекта:
public class TutorEntityConfiguration : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.ToTable("Tutors");

builder.HasKey(t => t.Id);

builder.Property(t => t.FirstName)
.IsRequired();

builder.Property(t => t.LastName)
.IsRequired();

builder.HasMany(t => t.Availabilities)
.WithOne(a => a.Tutor)
.HasForeignKey(a => a.TutorId);
}
}

И:
public class AvailabilityEntityConfiguration : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.ToTable("Availabilities");

builder.HasKey(a => a.Id);

builder.Property(a => a.StartDateTime)
.IsRequired();

builder.Property(a => a.EndDateTime)
.IsRequired();

builder.Property(a => a.Recurring)
.IsRequired();

builder.HasOne(a => a.Tutor)
.WithMany(t => t.Availabilities)
.HasForeignKey(a => a.TutorId)
.IsRequired();
}
}

Я использую методы TutorRepository:
public void Update(Tutor tutor)
{
this.context.Entry(tutor).State = EntityState.Modified;
}

public async Task GetTutorByIdAsync(Guid tutorId, CancellationToken cancellationToken)
{
return await this.context.Tutors
.Include(t => t.Availabilities)
.FirstOrDefaultAsync(t => t.Id == tutorId, cancellationToken);
}

Наконец, CommandHandler:
public async Task Handle(CreateAvailabilityCommand request, CancellationToken cancellationToken)
{
Tutor tutor = await this.tutorRepository.GetTutorByIdAsync(request.TutorId, cancellationToken) ?? throw new Exception("Tutor not found");
tutor.AddAvailability(request.StartTime, request.EndTime, false);

this.tutorRepository.Update(tutor);
_ = await this.tutorRepository.UnitOfWork.SaveEntitiesAsync(cancellationToken);
return tutor.Id;
}


Подробнее здесь: https://stackoverflow.com/questions/785 ... d-to-affec

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