[英]AbpEntityChanges is not recorded for module
I turned on the EntityHistory in the module, but when I edit a data, AbpEntityChanges is not recorded.Now my dbContext looks like this,If I use AbpZeroDbContext, I must have TTenant, TRole, TUser?我打开了模块中的EntityHistory,但是当我编辑一个数据时,AbpEntityChanges没有被记录。现在我的dbContext是这样的,如果我使用AbpZeroDbContext,我必须有TTenant,TRole,TUser? I don't need any of that, so I'm using the EntityChangeEnthelper of AbpDbContext, which still doesn't work:我不需要这些,所以我使用了 AbpDbContext 的 EntityChangeEnthelper,它仍然不起作用:
[DependsOn(typeof(AbpEntityFrameworkModule), typeof(ReportDesignCoreModule))]
public class ReportDesignDataModule : AbpModule
{
public override void PreInitialize()
{
Configuration.EntityHistory.IsEnabled = true;
Configuration.EntityHistory.IsEnabledForAnonymousUsers = true;
Configuration.DefaultNameOrConnectionString = ConnectionStringConstruction.ConnectionString;
}
public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
Database.SetInitializer<ReportDesignDbContext>(null);
}
}
The entity code:实体代码:
[Audited]
public class PDEDataSource : BaseEntity<int>
{
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 简介
/// </summary>
public string Description { get; set; }
/// <summary>
/// 类型: sqlserver、webapi
/// </summary>
public int Type { get; set; }
/// <summary>
/// 连接字符串
/// </summary>
public string ConnectionString { get; set; }
}
The base entity code:基本实体代码:
public class BaseEntity<T> : Entity<T>, IHasCreationTime, IHasModificationTime
{
/// <summary>
/// 创建人Id
/// </summary>
public int? CreatorUserId { get; set; }
/// <summary>
/// 创建人姓名或账号
/// </summary>
public virtual string CreatorUser { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreationTime { get; set; }
/// <summary>
/// 修改人Id
/// </summary>
public int? LastModifierUserId { get; set; }
/// <summary>
/// 修改人名字或账号
/// </summary>
public virtual string LastModifierUser { get; set; }
/// <summary>
/// 最后编辑时间
/// </summary>
public DateTime? LastModificationTime { get; set; }
public BaseEntity()
{
this.CreationTime = DateTime.Now;
}
}
The DbContext code: DbContext 代码:
public class ReportDesignDbContext : AbpDbContext //AbpZeroCommonDbContext
{
#region 审计日志
public virtual IDbSet<AuditLog> AuditLog { get; set; }
#endregion
#region 实体更改EntityChangeSets
public virtual IDbSet<EntityChange> EntityChanges { get; set; }
public virtual IDbSet<EntityChangeSet> EntityChangeSets { get; set; }
public virtual IDbSet<EntityPropertyChange> EntityPropertyChanges { get; set; }
#endregion
#region
public virtual IDbSet<Book> Book { get; set; }
public virtual IDbSet<PDEDataSource> PDEDataSource { set; get; }
#endregion
public ReportDesignDbContext(string nameOrConnectionString)
: base(nameOrConnectionString)
{
}
public override int SaveChanges()
{
try
{
var changedEntities = ApplyAbpConcepts();
var result = base.SaveChanges();
EntityChangeEventHelper.TriggerEvents(changedEntities);
return result;
}
catch (DbEntityValidationException ex)
{
LogDbEntityValidationException(ex);
throw;
}
}
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken)
{
try
{
var changeReport = ApplyAbpConcepts();
var result = await base.SaveChangesAsync(cancellationToken);
await EntityChangeEventHelper.TriggerEventsAsync(changeReport);
return result;
}
catch (DbEntityValidationException ex)
{
LogDbEntityValidationException(ex);
throw;
}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<PDEDataSource>().Property(t => t.Name).HasMaxLength(50);
modelBuilder.Entity<PDEDataSource>().Property(t => t.Description).HasMaxLength(200);
modelBuilder.Entity<PDEDataSource>().Property(t => t.ConnectionString).HasMaxLength(200);
base.OnModelCreating(modelBuilder);
}
}
The controller code: controller代码:
[RoutePrefix("api/datasoucre")]
public class DataSourceController : ReportDesignControllerBase
{
private readonly IDataSourceService _dataSource;
public DataSourceController(IDataSourceService dataSource)
{
_dataSource = dataSource;
}
/// <summary>
/// 数据源列表(带分页)
/// </summary>
/// <param name="input">分页参数等</param>
/// <returns></returns>
[HttpGet, Route()]
public PagedResultDto<GetDataSourceListOutputDto> GetDataSourceList([FromUri] GetDataSourceListInputDto input)
{
var result = _dataSource.GetDataSourceList(input);
return result;
}
/// <summary>
/// 新增数据源
/// </summary>
/// <param name="input">数据源信息</param>
/// <returns></returns>
[HttpPost, Route()]
public async Task AddDataSourceAsync([FromBody] AddDataSourceInputDto input)
{
await _dataSource.AddDataSourceAsync(input);
}
/// <summary>
/// 获取数据源详情
/// </summary>
/// <param name="id">数据源Id,必传</param>
/// <returns></returns>
[HttpGet, Route("detail/{id}")]
public async Task<GetDataSourceDetailOutputDto> GetDataSourceDetailAsync(int id)
{
var result = await _dataSource.GetDataSourceDetailAsync(id);
return result;
}
/// <summary>
/// 删除数据源
/// </summary>
/// <param name="id">数据源id,必传</param>
/// <returns></returns>
[HttpDelete, Route("{id}")]
public async Task DeleteDataSourceAsync(int id)
{
await _dataSource.DeleteDataSourceAsync(id);
}
/// <summary>
/// 编辑数据源
/// </summary>
/// <param name="id">数据源id,必传</param>
/// <param name="input">新的数据源信息</param>
/// <returns></returns>
[HttpPut, Route("{id}")]
public async Task UpdateDataSourceAsync(int id, [FromBody] UpdateDataSourceInputDto input)
{
await _dataSource.UpdateDataSourceAsync(id, input);
}
}
The database table:数据库表:
If you don't have another DbContext
that inherits from AbpZeroCommonDbContext
or AbpZeroDbContext
, then you should inherit one of those.如果您没有从AbpZeroCommonDbContext
或AbpZeroDbContext
继承的另一个DbContext
,那么您应该继承其中之一。
If you do, then copy SaveChanges
and SaveChangesAsync
from AbpZeroCommonDbContext
to your DbContext
.如果这样做,则将SaveChanges
和SaveChangesAsync
从AbpZeroCommonDbContext
复制到您的DbContext
。 (Since you have AbpEntityChanges
table in your database, it means you do.) (因为你的数据库中有AbpEntityChanges
表,这意味着你有。)
public class ReportDesignDbContext : AbpDbContext
{
// IDbSets
// ...
public IEntityHistoryHelper EntityHistoryHelper { get; set; }
// Constructors
// ...
public override int SaveChanges()
{
var changeSet = EntityHistoryHelper?.CreateEntityChangeSet(ChangeTracker.Entries().ToList());
var result = base.SaveChanges();
EntityHistoryHelper?.Save(changeSet);
return result;
}
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
{
var changeSet = EntityHistoryHelper?.CreateEntityChangeSet(ChangeTracker.Entries().ToList());
var result = await base.SaveChangesAsync(cancellationToken);
if (EntityHistoryHelper != null)
{
await EntityHistoryHelper.SaveAsync(changeSet);
}
return result;
}
}
References:参考:
SaveChanges
and SaveChangesAsync
from AbpZeroCommonDbContext
来自AbpZeroCommonDbContext
的SaveChanges
和SaveChangesAsync
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.