简体   繁体   English

没有为模块记录 AbpEntityChanges

[英]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.如果您没有从AbpZeroCommonDbContextAbpZeroDbContext继承的另一个DbContext ,那么您应该继承其中之一。

If you do, then copy SaveChanges and SaveChangesAsync from AbpZeroCommonDbContext to your DbContext .如果这样做,则将SaveChangesSaveChangesAsyncAbpZeroCommonDbContext复制到您的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:参考:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM