【问题标题】:Value cannot be null. Parameter name: dbContextTransaction - IntegrationEvent c#值不能为空。参数名称:dbContextTransaction - IntegrationEvent c#
【发布时间】:2019-09-27 06:28:46
【问题描述】:

我正在使用 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());
    }
}

【问题讨论】:

  • _osDataContext.GetCurrentTransaction 正在返回 null。

标签: c# asp.net entity-framework microservices event-bus


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2014-05-17
    • 2016-05-14
    相关资源
    最近更新 更多