c# - 将 ChangeTracker 注入构造函数
问题描述
我想重用我们在另一个带有 asp.net 核心的项目中提出的概念。在保存实体之前,注册IEntityMetadataProvider
的 s 将被调用,代码如下:DbContext
public class SppdContext : DbContext
{
private readonly IEnumerable<IEntityMetadataProvider> _entityMetadataProviders;
public SppdContext(DbContextOptions<SppdContext> options, IEnumerable<IEntityMetadataProvider> entityMetadataProviders) : base(options)
{
_entityMetadataProviders = entityMetadataProviders;
}
public override int SaveChanges()
{
PrepareSaveChanges();
return base.SaveChanges();
}
private void PrepareSaveChanges()
{
ChangeTracker.DetectChanges();
SetModifierMetadataOnChangedEntities();
}
private void SetModifierMetadataOnChangedEntities()
{
foreach (var entityMetadataProvider in _entityMetadataProviders)
{
entityMetadataProvider.SetModifierMetadataOnChangedEntities();
}
}
}
-
public class EntityMetadataProvider : IEntityMetadataProvider
{
private readonly ChangeTracker _changeTracker;
public EntityMetadataProvider(ChangeTracker changeTracker)
{
_changeTracker = changeTracker;
}
public void SetModifierMetadataOnChangedEntities()
{
var entriesToSetModifier = _changeTracker.Entries<BaseEntity>().Where(e => HasToSetModifierMetadata(e.State)).ToList();
if (entriesToSetModifier.Count > 0)
{
var saveDate = DateTime.UtcNow;
foreach (var entryToSetModifier in entriesToSetModifier)
{
SetModifierMetadataProperties(entryToSetModifier, saveDate);
}
}
}
private static bool HasToSetModifierMetadata(EntityState state)
{
return state == EntityState.Added || state == EntityState.Modified;
}
private static void SetModifierMetadataProperties(EntityEntry<BaseEntity> entry, DateTime saveDate)
{
if (entry.State == EntityState.Added)
{
entry.Property(e => e.CreatedOn).CurrentValue = saveDate;
}
else
{
entry.Property(e => e.CreatedOn).IsModified = false;
}
}
}
DbContext
正在像这样注册:
var connectionString = "Data Source=.\\SQLEXPRESS; Initial Catalog=Sppd; Integrated Security=true; MultipleActiveResultSets=True;";
services.AddDbContext<SppdContext>(options => options.UseSqlServer(connectionString));
通过这个实现,我在打开时得到以下异常var context = serviceScope.ServiceProvider.GetRequiredService<SppdContext>();
:
Unable to resolve service for type 'Microsoft.EntityFrameworkCore.ChangeTracking.ChangeTracker' while attempting to activate 'SppdDocs.Infrastructure.DbAccess.EntityMetadataProvider'.
我如何注册ChangeTracker
以便可以注入?
解决方案
如果我理解正确,您想在 SppdContext 的更改跟踪器中查找更改。
您无法通过注入获得 changetracker。它由您的上下文实例拥有。您应该在调用方法而不是构造函数时传递 Changetracker。
在 SpddContext 类中你会得到
private void SetModifierMetadataOnChangedEntities()
{
foreach (var entityMetadataProvider in _entityMetadataProviders)
{
entityMetadataProvider.SetModifierMetadataOnChangedEntities(ChangeTracker);
}
}
在 EntityMetaDataProvider 中:
public class EntityMetadataProvider : IEntityMetadataProvider
{
public EntityMetadataProvider()
{
}
public void SetModifierMetadataOnChangedEntities(ChangeTracker changeTracker)
{
var entriesToSetModifier = changeTracker.Entries<BaseEntity>().Where(e =>
HasToSetModifierMetadata(e.State)).ToList();
if (entriesToSetModifier.Count > 0)
{
var saveDate = DateTime.UtcNow;
foreach (var entryToSetModifier in entriesToSetModifier)
{
SetModifierMetadataProperties(entryToSetModifier, saveDate);
}
}
}
...
推荐阅读
- node.js - Node js相当于Python utf8、Sha1、base64
- android - Android 11 未在应用程序中显示 WhatsApp 状态。/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/.Statuses/ 文件夹显示空结果
- python - 无法使用 torch.save() 将模型保存到 gs 存储桶
- javascript - Ruby on Rails - 我有来自 Heroku 的 H27 错误
- javascript - 如何通过单击打印多个子组件页面?
- reactjs - 如何将表单与其结果联系起来
- azure - KQL 时间表可视化显示特定资源随时间的总数
- python - Boto SQS 获取大量消息
- arrays - 当复选框未选中时,我想返回我的所有列表
- bash - 在 ENTRYPOINT 中运行 bash 脚本:exec 用户进程导致:exec 格式错误