Coldairarrow / EFCore.Sharding

Database Sharding For EFCore
Apache License 2.0
694 stars 144 forks source link

逻辑删除时失败 #13

Closed wensaint closed 4 years ago

wensaint commented 4 years ago

物理删除时,操作成功。当启用逻辑删除时,添加修改功能正常,删除时报如下错误。

2020-05-12 14:48:50.374 +08:00 [ERR] MySql.Data.MySqlClient.MySqlException (0x80004005): Table 'basevue.sysadmin' doesn't exist ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Table 'basevue.sysadmin' doesn't exist at MySqlConnector.Core.ServerSession.ReceiveReplyAsyncAwaited(ValueTask1 task) in /_/src/MySqlConnector/Core/ServerSession.cs:line 777 at MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in /_/src/MySqlConnector/Core/ResultSet.cs:line 51 at MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet() in /_/src/MySqlConnector/MySql.Data.MySqlClient/MySqlDataReader.cs:line 130 at MySql.Data.MySqlClient.MySqlDataReader.CreateAsync(CommandListPosition commandListPosition, ICommandPayloadCreator payloadCreator, IDictionary2 cachedProcedures, IMySqlCommand command, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in //src/MySqlConnector/MySql.Data.MySqlClient/MySqlDataReader.cs:line 391 at MySqlConnector.Core.CommandExecutor.ExecuteReaderAsync(IReadOnlyList`1 commands, ICommandPayloadCreator payloadCreator, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in //src/MySqlConnector/Core/CommandExecutor.cs:line 62 at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQueryAsync(IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySql.Data.MySqlClient/MySqlCommand.cs:line 220 at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQueryAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQueryAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQueryAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.ExecuteSqlRawAsync(DatabaseFacade databaseFacade, String sql, IEnumerable1 parameters, CancellationToken cancellationToken) at EFCore.Sharding.DbRepository.ExecuteSqlAsync(String sql, ValueTuple2[] paramters) at EFCore.Sharding.DbRepository.UpdateWhere_SqlAsync(IQueryable source, ValueTuple3[] values) at EFCore.Sharding.LogicDeleteRepository.Delete_SqlAsync(IQueryable source) at EFCore.Sharding.LogicDeleteRepository.DeleteAsync(Type type, List1 keys) at EFCore.Sharding.LogicDeleteRepository.DeleteAsync[T](List1 keys) at Wensaint.BaseVue.Services.BaseService2.DeleteAsync(List1 keys) in D:\Rnd\BaseVue\Src\Wensaint.Services\BaseService.cs:line 407 at Wensaint.BaseVue.Api.CRUDApiControllerBase2.DeleteAsync(String id) in D:\Rnd\BaseVue\Src\Wensaint.Api\Controllers\ApiControllerBase.cs:line 176 at lambda_method(Closure , Object ) at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult() at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.gAwaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.gAwaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)

其中sysAdmin的实体定义如下: [Table("sys_admin")] public class sysAdmin { …… }

wensaint commented 4 years ago

经初步分析,问题应该出在 EFCore.Sharding\Repository\DbRepository.cs 文件第139行

string tableName = iq.ElementType.Name;

此外取到的为实体的类名,未必是实际的表名(实际表名应以TableAttribute为准)。 你自己的示例项目由于类名与表名完全一致,所以一直没有出现类似的问题。

项目代码中存在大量同样的问题,请确认。

Coldairarrow commented 4 years ago

多谢反馈 从设计角度讲,建议实体名与数据库表明完全一致

wensaint commented 4 years ago

多谢反馈 从设计角度讲,建议实体名与数据库表明完全一致

客气了,共同进步。 麻烦帮忙修改一下,兼容这种不一致的情况。

Coldairarrow commented 4 years ago

最新版已修复