У меня проблема с записями dbcontext.
У меня есть 2 объекта, которые нужно сохранить в базе данных с помощью EF Core. EntityA EntityB
EntityA уже сохранен в базе данных, а EntityB нет.
Когда я вызываю свой код в SaveChanges EntityA, у меня появляется ошибка Дублирующая запись '7c4e4552-c46f-4153-b1e8-c9ebfca135a4 'для ключа' PRIMARY ', нормально, тогда я хочу сохранить EntityB, но когда я вызываю свой SaveChanges, я вижу, что у меня есть 2 записи в моей коллекции записей DBContext, и я не могу сохранить EntityB, потому что EF пытается снова для сохранения EntityA.
public async Task<TEntity> AddAsync(TEntity entity)
{
if (entity == null)
{
throw new ArgumentNullException($"{nameof(AddAsync)} entity must not be null");
}
try
{
await Context.AddAsync(entity);
await Context.SaveChangesAsync();
return entity;
}
catch (Exception ex)
{
throw new Exception($"{nameof(entity)} could not be saved. {errorMessage}");
}
}
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
{
// Get all the entities that inherit from AuditableEntity
// and have a state of Added or Modified
var entries = ChangeTracker
.Entries()
.Where(e => e.Entity is AuditableEntity && (
e.State == EntityState.Added
|| e.State == EntityState.Modified));
// For each entity we will set the Audit properties
foreach (var entityEntry in entries) ***//Here are 2 when I only want 1***
{
// If the entity state is Added let's set
// the CreatedAt and CreatedBy properties
if (entityEntry.State == EntityState.Added)
{
((AuditableEntity)entityEntry.Entity).CreatedAt = DateTime.UtcNow;
((AuditableEntity)entityEntry.Entity).CreatedBy = _httpContextAccessor?.HttpContext?.User?.Identity?.Name ?? MyApp;
}
else
{
// If the state is Modified then we don't want
// to modify the CreatedAt and CreatedBy properties
// so we set their state as IsModified to false
Entry((AuditableEntity)entityEntry.Entity).Property(p => p.CreatedAt).IsModified = false;
Entry((AuditableEntity)entityEntry.Entity).Property(p => p.CreatedBy).IsModified = false;
}
// In any case we always want to set the properties
// ModifiedAt and ModifiedBy
((AuditableEntity)entityEntry.Entity).ModifiedAt = DateTime.UtcNow;
((AuditableEntity)entityEntry.Entity).ModifiedBy = _httpContextAccessor?.HttpContext?.User?.Identity?.Name ?? MyApp;
}
// After we set all the needed properties
// we call the base implementation of SaveChangesAsync
// to actually save our entities in the database
return await base.SaveChangesAsync(cancellationToken);
}