dotnetcore / sharding-core

high performance lightweight solution for efcore sharding table and sharding database support read-write-separation .一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案,具有零依赖、零学习成本、零业务代码入侵
https://xuejmnet.github.io/sharding-core-doc/
Apache License 2.0
1.17k stars 171 forks source link

根据时间分表:未获取到设置的时间值 #271

Closed gainorloss closed 3 months ago

gainorloss commented 4 months ago

添加数据:我的某个日志表需要根据年份去分表,其中的路由字段创建时间是在 SavingChanges 事件中处理给值的,报错是提示取到的这个字段为没赋值之前的默认值,请问下,我这个应该如何调整才能兼容

xuejmnet commented 4 months ago

@gainorloss 啥叫没赋值之前的默认值,你是新增的话不是对象里面会给比如createTime赋值吗,你是通过拦截器来实现的?还是什么.你的框架是abp还是纯aspnetcore自己的

gainorloss commented 4 months ago

你好我是利用efcore的 保存之前的事件 事件名为 SavingChanges

QQ截图20240731112050

gainorloss commented 4 months ago

你的框架是abp还是纯aspnetcore自己的

纯aspnetcore efcore本身的,非abp

xuejmnet commented 4 months ago

@gainorloss 你需要把拦截器注册到sharding-core提供的配置那边

image

UseShardingTransaction

gainorloss commented 4 months ago

你好,值其实在最终保存的时候是获取到了,看报错应该是路由在寻表的时候没有正确获取到创建时间,

  1. 我这边设置的是一个事件注册,事件注册是在构造函数完成 不是一个拦截器
  2. 假设我这边用拦截器做字段审核填充,我在构造函数里面完成了拦截器添加,这边在注册sharding-core的时候还需要再添加一次吗 问题像是取路由键的时机问题,这边是在什么时候获取的路由键呢
xuejmnet commented 4 months ago

@gainorloss addAsync的时候会获取stateManger这个时候就会根据路由键获取正确的dbcontext的正确的stateManager所以可能拦截器里面不能设置路由键他会比一开始选择正确的dbcontext要前

先根据路由键获取正确的dbcontext,然后才会在dbcontext去执行正确的拦截器

xuejmnet commented 4 months ago

所以除了路由键其他的值都可以通过拦截器设置

gainorloss commented 4 months ago

好的,谢谢,我研究下