问题描述
我一直在开发自己的项目,我一直在使用 .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.ConcurrentDictionary
2.GetOrAdd(TKey key,Func2 valueFactory) at DevPlatform.Data.Mapping.FluentMigratorMetadataReader.<>c__DisplayClass2_0
1.b__0(ValueTuple2 t) in C:\Projects\DevPlatform\DevPlatform.Data\Mapping\FluentMigratorMetadataReader.cs:line 42 at System.Collections.Concurrent.ConcurrentDictionary
2.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_0
1.AddRange(IEnumerable3.MoveNext() at System.Collections.Generic.LargeArrayBuilder
1 源)
在 LinqToDB.Mapping.MappingSchema.GetAttributes[T](类型类型,布尔继承)
在 LinqToDB.Mapping.MappingSchema.GetAttributes[T](Type type,Func1 items) at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable
2 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,Func
4 factory)
在 LinqToDB.Mapping.MappingSchema.GetEntityDescriptor(类型类型)
在 LinqToDB.Linq.QueryRunner.GetType[T](T obj,IDataContext db)
在 LinqToDB.Linq.QueryRunner.InsertWithIdentity`1.d__2.MoveNext()
解决方法
通过编辑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