#c# #asp.net-core #audit.net
Вопрос:
В моем проекте у меня много таблиц, и я использую Аудит.СЕТЬ для отслеживания всех изменений в записях. Это хорошо работает. У меня долгий процесс, в ходе которого я сохраняю каждую строку из файла Excel в базу данных. В производственной среде я обнаружил эту ошибку
Свойство внешнего ключа ‘AuditQuantitativeResearch.AuditID’ был обнаружен как измененный. Рассмотрите возможность использования DbContextOptionsBuilder.Включает функцию «Чувствительная регистрация» для просмотра значений свойств.
{«AspNetCoreEnvironment»:»Производство»,»Исходный формат»:»Свойство внешнего ключа» {EntityType}.{свойство} » было обнаружено как измененное. Рассмотрите возможность использования DbContextOptionsBuilder.Позволяет вести учет с чувствительностью’ для просмотра значений свойств.»,»Имя категории»:»Microsoft.EntityFrameworkCore.Отслеживание изменений»,»Имя события»:»Microsoft.EntityFrameworkCore.Отслеживание изменений.ForeignKeyChangeDetected»,»EventId»:»10803″,»entityType»:»AuditQuantitativeResearch»,»property»:»AuditId»}
Это приводит к очень длительному процессу, и процедура ничего не сохраняет в базе данных.
Определение таблицы выглядит следующим образом
public class QuantitativeResearch : ITable
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long ID { get; set; }
public DateTime CreatedAt { get; set; } = DateTime.Now;
// more properties
}
и таблица аудита, связанная с этой таблицей, является
public class AuditQuantitativeResearch : IAudit
{
[Key]
public long AuditId { get; set; }
public long ID { get; set; }
}
The base repository for adding a new record is like that
public async Task<T> AddAsync(T entity)
{
_log.LogDebug($"[{nameof(T)}] Adding a new record");
try
{
_db.Entry(entity).State = EntityState.Added;
await _db.Set<T>().AddAsync(entity);
_db.SaveChanges();
}
catch (Exception ex)
{
_log.LogError(ex, "Adding a new record");
}
return entity;
}
The audit and all the add/update/delete is working for all the other entities. On the dev environment (some server than the production under IIS but different pool) and locally the process is working also with this table.
Update
This is the configuration of Audit.NET
public static IServiceCollection ConfigureAudit(
this IServiceCollection serviceCollection,
string connString)
{
#region Use this when you have another table for audit
Audit.Core.Configuration.Setup()
.UseEntityFramework(ef => ef.AuditTypeExplicitMapper(m => m
.Map<QuantitativeResearch, AuditQuantitativeResearch>()
.AuditEntityAction<IAudit>((evt, entry, auditEntity) =>
{
auditEntity.AuditDate = DateTime.UtcNow;
auditEntity.UserName = evt.Environment.UserName;
auditEntity.AuditAction = entry.Action;
}))); ;
#endregion Use this when you have another table for audit
return serviceCollection;
}
Это пакеты, которые я использую
<ItemGroup>
<PackageReference Include="Audit.EntityFramework.Core" Version="18.1.5" />
<PackageReference Include="Audit.NET" Version="18.1.5" />
<PackageReference Include="Audit.NET.SqlServer" Version="18.1.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.9">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.9" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="5.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
Как примечание, у меня есть еще 101 таблица с такой же конфигурацией, но только у этой есть эта проблема. Конфигурация одинакова, правила поведения между основной таблицей и таблицей аудита одинаковы.
Комментарии:
1. Как говорилось в сообщении об ошибке, «Свойство внешнего ключа ‘AuditQuantitativeResearch. Идентификатор проверки «был обнаружен как измененный», вы можете использовать «DbContextOptionsBuilder». Включениесенситивной регистрации» для просмотра значений свойств или проверки конфигурации внешнего ключа таблицы связей в коде попробуйте использовать API конфигурации Fluent для настройки внешнего ключа. Кроме того, вот статья об изменении отношений с помощью навигации , вы можете обратиться к ней.
2. Кроме того, пожалуйста, поделитесь своей конфигурацией для
Audit.Core
иAudit.EntityFramework
3. Есть ли у вас внешний ключ, на который указывает
AuditQuantitativeResearch.AuditId
?4. Нет, у меня нет никакого внешнего ключа, чтобы
AuditId
. Таблицы аудита не связаны со всем