首页 > 解决方案 > 值不能为空。参数名称:dbContextTransaction - IntegrationEvent c#

问题描述

我正在使用 EventBus 来通知其他微服务。当客户被保存时。事件集成必须使其他微服务保持同步我正在进行事件集成。我从微软那里得到了一个关于事件总线的例子。

当应用程序到达此方法时

public async Task AddAndSaveEventAsync(IntegrationEvent evt)
{
     await _eventLogService.SaveEventAsync(evt, _osDataContext.GetCurrentTransaction.GetDbTransaction());
}

通过这个方法进入后不久,它又通过另一个发生错误的方法

namespace Microsoft.EntityFrameworkCore.Storage
{
    public static class DbContextTransactionExtensions
    {
        public static DbTransaction GetDbTransaction([NotNullAttribute] this IDbContextTransaction dbContextTransaction);
    }
}

它返回给我一个错误:Value can not be null. Parameter name: dbContextTransaction

我有我的数据库上下文类

public partial class ApplicationDataContext : DbContext
{
    public ApplicationDataContext(DbContextOptions<ApplicationDataContext> options) : base(options)
    {
    }

    private IDbContextTransaction _currentTransaction;
    public IDbContextTransaction GetCurrentTransaction => _currentTransaction;

    public async Task BeginTransactionAsync()
    {
        _currentTransaction = _currentTransaction ?? await Database.BeginTransactionAsync(IsolationLevel.ReadCommitted);
    }

    public async Task CommitTransactionAsync()
    {
        try
        {
            await SaveChangesAsync();
            _currentTransaction?.Commit();
        }
        catch
        {
            RollbackTransaction();
            throw;
        }
        finally
        {
            if (_currentTransaction != null)
            {
                _currentTransaction.Dispose();
                _currentTransaction = null;
            }
        }
    }

    public void RollbackTransaction()
    {
        try
        {
            _currentTransaction?.Rollback();
        }
        finally
        {
            if (_currentTransaction != null)
            {
                _currentTransaction.Dispose();
                _currentTransaction = null;
            }
        }
    }

    public const string DEFAULT_SCHEMA = "serviceorder";

    public DbSet<model.ServiceOrder> ServiceOrder { get; set; }
    public DbSet<ServiceOrderType> ServiceOrderType { get; set; }
    public DbSet<ContactRole> ContactRole { get; set; }
    public DbSet<Contact> Contact { get; set; }
    public DbSet<DocumentType> DocumentType { get; set; }
    public DbSet<Document> Document { get; set; }
    public DbSet<Customer> Customer { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfiguration(new ServiceOrderTypeConfiguration());
        modelBuilder.ApplyConfiguration(new ServiceOrderConfiguration());
        modelBuilder.ApplyConfiguration(new CustomerConfiguration());
        modelBuilder.ApplyConfiguration(new DocumentConfiguration());
        modelBuilder.ApplyConfiguration(new DocumentTypeConfiguration());
        modelBuilder.ApplyConfiguration(new ContactConfiguration());
        modelBuilder.ApplyConfiguration(new ContactRoleConfiguration());
    }
}

标签: c#asp.netentity-frameworkmicroservicesevent-bus

解决方案


这个错误基本上是。对于不打开连接,即。我正在拨打电话,但没有打开连接。

    public async Task AddAndSaveEventAsync(IntegrationEvent evt)
        {
            await ResilientTransaction.New(_osDataContext).ExecuteAsync(async () =>
               {
                   await _osDataContext.SaveChangesAsync();
                   await _eventLogService.SaveEventAsync(evt, _osDataContext.Database.CurrentTransaction.GetDbTransaction());
               });
        }


推荐阅读