Linq2Db 异步插入 - 无法访问已处理的对象 ObjectDisposed_ObjectName_Name'

问题描述

我一直在开发自己的项目,我一直在使用 .Net Core 3.1 和 Linq2b ORM 工具。我有一个关于使用 async meto 插入数据的问题。我想插入一个日志数据。在Linq2Db中有一个叫做InsertWithInt32IdentityAsync的方法。此方法返回一个错误,称为无法访问已处理的对象。对象名称:IServiceProvider

这是实现。

    [HttpPost("createpost")]
    [Authorize]
    public virtual async Task<JsonResult> CreatePost([FromForm] PostCreateApi model)
    {
        var serviceResponse = _postService.Create(model);

        if (serviceResponse.Warnings.Count > 0 || serviceResponse.Warnings.Any())
            return BadResponse(new ResultModel
            {
                Status = false,Message = serviceResponse.Warnings.First()
            });
        
        //Here returns an error
        await _logService.InsertLogAsync(Domain.Enumerations.LogLevel.Information,$"PostsController- Create Post Request",JsonConvert.SerializeObject(model));

        return OkResponse(new PostListDto
        {
            Id = serviceResponse.Data.Id,Text = serviceResponse.Data?.Text,ImageUrl = serviceResponse.Data.ImageUrl?.ToString(),CreatedByUserName = serviceResponse.Data?.CreatedByUserName,CreatedByUserPhoto = serviceResponse.Data?.CreatedByUserPhoto,CreatedDate = serviceResponse.Data.CreatedDate,VideoUrl = serviceResponse.Data?.VideoUrl,PostType = serviceResponse.Data?.PostType,Comments = null
        });
    }

这里是 InsertLogAsync 方法。

 public virtual async Task<Log> InsertLogAsync(LogLevel logLevel,string shortMessage,string fullMessage = "",AppUser appUser = null)
    {
        var log = new Log
        {
            LogLevel = logLevel,ShortMessage = shortMessage,FullMessage = fullMessage,IpAddress = _webHelper.GetCurrentIpAddress(),CustomerId = appUser?.Id,PageUrl = _webHelper.GetThisPageUrl(true),ReferrerUrl = _webHelper.GetUrlReferrer(),CreatedDate = DateTime.UtcNow
        };

        await _logRepository.InsertAsync(log);

        return log;
    }

这是 BaseDataProvider InsertEntityAsync 方法。

  public virtual async Task<TEntity> InsertEntityAsync<TEntity>(TEntity entity) where TEntity : 
  BaseEntity
    {
        using var dataContext = CreateDataConnection();
        entity.Id = await dataContext.InsertWithInt32IdentityAsync(entity);
        return entity;
    }

这是StackTrace

在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ThrowHelper.ThrowObjectDisposedException() 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) 在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider) 在 FluentMigrator.Infrastructure.MigrationContext..ctor(IQuerySchema querySchema,IServiceProvider serviceProvider,Object context,String connection) 在 DevPlatform.Data.Migrations.MigrationManager.CreateNullMigrationContext() 在 C:\Projects\DevPlatform\DevPlatform.Data\Migrations\MigrationManager.cs:line 165 在 DevPlatform.Data.Migrations.MigrationManager.GetCreateTableExpression(Type type) in C:\Projects\DevPlatform\DevPlatform.Data\Migrations\MigrationManager.cs:line 240 在 DevPlatform.Data.Mapping.FluentMigratorMetadataReader.c__DisplayClass2_01.<GetAttribute>b__1(Type entityType) in C:\Projects\DevPlatform\DevPlatform.Data\Mapping\FluentMigratorMetadataReader.cs:line 42 at System.Collections.Concurrent.ConcurrentDictionary2.GetOrAdd(TKey key,Func2 valueFactory) at DevPlatform.Data.Mapping.FluentMigratorMetadataReader.<>c__DisplayClass2_01.b__0(ValueTuple2 t) in C:\Projects\DevPlatform\DevPlatform.Data\Mapping\FluentMigratorMetadataReader.cs:line 42 at System.Collections.Concurrent.ConcurrentDictionary2.GetOrAdd(TKey key,Func{{) 1}}1.b__0(IMetadataReader 先生) 在 System.Linq.Enumerable.d__1812 valueFactory) at DevPlatform.Data.Mapping.FluentMigratorMetadataReader.GetAttribute[T](Type type,MemberInfo memberInfo) in C:\Projects\DevPlatform\DevPlatform.Data\Mapping\FluentMigratorMetadataReader.cs:line 40 at DevPlatform.Data.Mapping.FluentMigratorMetadataReader.GetAttributes[T](Type type,Type attributeType,MemberInfo memberInfo) in C:\Projects\DevPlatform\DevPlatform.Data\Mapping\FluentMigratorMetadataReader.cs:line 76 at DevPlatform.Data.Mapping.FluentMigratorMetadataReader.GetAttributes[T](Type type,Boolean inherit) in C:\Projects\DevPlatform\DevPlatform.Data\Mapping\FluentMigratorMetadataReader.cs:line 97 at LinqToDB.Mapping.MappingSchema.<>c__DisplayClass51_01.AddRange(IEnumerable3.MoveNext() at System.Collections.Generic.LargeArrayBuilder1 源) 在 LinqToDB.Mapping.MappingSchema.GetAttributes[T](类型类型,布尔继承) 在 LinqToDB.Mapping.MappingSchema.GetAttributes[T](Type type,Func1 items) at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable2 configGetter,Boolean inherit) 在 LinqToDB.Mapping.EntityDescriptor.Init() 在 LinqToDB.Mapping.EntityDescriptor..ctor(MappingSchema mappingSchema,Type type) 在 LinqToDB.Mapping.MappingSchema.c.b__92_0(ICacheEntry o,f__AnonymousType1312 configGetter,Boolean inherit,Boolean exactForConfiguration) at LinqToDB.Mapping.MappingSchema.GetAttribute[T](Type type,Func4 factory) 在 LinqToDB.Mapping.MappingSchema.GetEntityDescriptor(类型类型) 在 LinqToDB.Linq.QueryRunner.GetType[T](T obj,IDataContext db) 在 LinqToDB.Linq.QueryRunner.InsertWithIdentity`1.d__2.MoveNext()

enter image description here

enter image description here

enter image description here

enter image description here

解决方法

通过编辑CreateTableExpressionBuilder并调用_migrationContext而不是调用CreateNullMigrationContext函数,问题已经解决。

代替下面的代码块;

    public virtual CreateTableExpression GetCreateTableExpression(Type type)
    {
        var expression = new CreateTableExpression { TableName = NameCompatibilityManager.GetTableName(type) };
        var builder = new CreateTableExpressionBuilder(expression,CreateNullMigrationContext());

        RetrieveTableExpressions(type,builder);

        return builder.Expression;
    }

我已针对此问题更改了 CreateTableExpressionBuilder

 public virtual CreateTableExpression GetCreateTableExpression(Type type)
    {
        var expression = new CreateTableExpression { TableName = NameCompatibilityManager.GetTableName(type) };
        var builder = new CreateTableExpressionBuilder(expression,_migrationContext);

        RetrieveTableExpressions(type,builder);

        return builder.Expression;
    }

CreateNullMigrationContext 函数返回一个我已经提到过的错误。

 protected IMigrationContext CreateNullMigrationContext()
    {
        return new MigrationContext(new NullIfDatabaseProcessor(),_migrationContext.ServiceProvider,null,null);
    }

非常感谢。 @StriplingWarrior、@Paulo Morgado 和 @Svyatoslav Danyliv

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...