最新要闻
- 咬甲癖是心理疾病吗?咬甲癖怎么治疗?
- 皮肤剥离强迫症是什么?皮肤剥离强迫症怎么治疗?
- 中移动董事长喊话中小学必学编程:还有委员喊话取消英语主科学了没用 你支持谁?
- 【世界快播报】最受欢迎的豪华中大型SUV 新款宝马X5实车亮相:国产必卖爆
- 湖北省“最强9万元补贴”蔓延 云南东风本田抄作业:直补6万
- 热点在线丨比Dev渠道更“快”!微软为Windows新增Canary测试渠道
- 全球观热点:砸130亿元 日本又失败!新主力火箭发射后自毁 日本专家谈落后中国多少年
- 焦点!【ES三周年】Elasticsearch安全配置详解
- 车主称极氪001空调喷白粉末 官方回应:符合国标没有损害
- 世界今热点:育碧参与 巴黎圣母院加速修复:力争明年重新开放
- 世界速看:为什么小米手机不在美国卖?看完原因对雷军更有好感
- 天天快看:魅族20 Pro真机照出炉:“纽扣”四摄有意思
- 今日聚焦!《卧龙》超猛玩家穿着内裤打Boss 张梁吕布都无奈了
- 叶辰是什么电视剧
- 环球观速讯丨迷惑行为!女司机给奥迪Q3加玻璃水:一股脑全倒进机油壶
- 天天热门:猪肉含量≥85% 一口全是肉:亚明猪肉烤肠2斤29.9元发车
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
环球热议:EF7数据库提供者的自定义值生成器
(相关资料图)
本文将讲解提供者使用值生成器的原理。因代码太多,本文只摘要重要代码,并且删除了代码中的注释。如果您不了解,如何使用EF的值生成器?
SqlServer提供者:
Microsoft.EntityFrameworkCore.SqlServer如下代码:我们可以看到提供者已经帮我们实现好了顺序Guid自定义值生成器。
public class SequentialGuidValueGenerator : ValueGenerator{ private long _counter = DateTime.UtcNow.Ticks; public override Guid Next(EntityEntry entry) { var guidBytes = Guid.NewGuid().ToByteArray(); var counterBytes = BitConverter.GetBytes(Interlocked.Increment(ref _counter)); if (!BitConverter.IsLittleEndian) { Array.Reverse(counterBytes); } guidBytes[08] = counterBytes[1]; guidBytes[09] = counterBytes[0]; guidBytes[10] = counterBytes[7]; guidBytes[11] = counterBytes[6]; guidBytes[12] = counterBytes[5]; guidBytes[13] = counterBytes[4]; guidBytes[14] = counterBytes[3]; guidBytes[15] = counterBytes[2]; return new Guid(guidBytes); } public override bool GeneratesTemporaryValues => false;}
有了值生成器,我们来看看数据库提供者是如何使用的。首先它帮我们写了生成值选择器,而只有在属性为Guid类型,切是需要生成值的状态下使用自动使用 SequentialGuidValueGenerator 值生成器。如下代码所示:
public class SqlServerValueGeneratorSelector : RelationalValueGeneratorSelector{ protected override ValueGenerator? FindForType(IProperty property, IEntityType entityType, Type clrType) => property.ClrType.UnwrapNullableType() == typeof(Guid) ? property.ValueGenerated == ValueGenerated.Never || property.GetDefaultValueSql() != null ? new TemporaryGuidValueGenerator() : new SequentialGuidValueGenerator() : base.FindForType(property, entityType, clrType);}
SqlServerValueGeneratorSelector 将附加到 AddEntityFrameworkSqlServer 中第109行。AddEntityFrameworkSqlServer 将被附加到 ApplyServices 中第66行。最终 ApplyServices 将为EF 核心内部API 解释服务与功能。
MySql提供者:
Pomelo.EntityFrameworkCore.MySql首先,MySql提供者与SqlServer提供者的原理是一样的机制。不过为了适配Mysql的uuid(RFC 4122)规范,提供者写了属于Mysql的顺序Guid自定义值生成器。
public class MySqlSequentialGuidValueGenerator : ValueGenerator{ private readonly IMySqlOptions _options; public MySqlSequentialGuidValueGenerator(IMySqlOptions options) { _options = options; } private static readonly RandomNumberGenerator _rng = RandomNumberGenerator.Create(); public override Guid Next(EntityEntry entry) { return Next(); } public Guid Next() { return Next(DateTimeOffset.UtcNow); } public Guid Next(DateTimeOffset timeNow) { var randomBytes = new byte[7]; _rng.GetBytes(randomBytes); var ticks = (ulong) timeNow.Ticks; var uuidVersion = (ushort) 4; var uuidVariant = (ushort) 0b1000; var ticksAndVersion = (ushort)((ticks << 48 >> 52) | (ushort)(uuidVersion << 12)); var ticksAndVariant = (byte) ((ticks << 60 >> 60) | (byte) (uuidVariant << 4)); if (_options.ConnectionSettings.GuidFormat == MySqlGuidFormat.LittleEndianBinary16) { var guidBytes = new byte[16]; var tickBytes = BitConverter.GetBytes(ticks); if (BitConverter.IsLittleEndian) { Array.Reverse(tickBytes); } Buffer.BlockCopy(tickBytes, 0, guidBytes, 0, 6); guidBytes[6] = (byte)(ticksAndVersion << 8 >> 8); guidBytes[7] = (byte)(ticksAndVersion >> 8); guidBytes[8] = ticksAndVariant; Buffer.BlockCopy(randomBytes, 0, guidBytes, 9, 7); return new Guid(guidBytes); } var guid = new Guid((uint) (ticks >> 32), (ushort) (ticks << 32 >> 48), ticksAndVersion, ticksAndVariant, randomBytes[0], randomBytes[1], randomBytes[2], randomBytes[3], randomBytes[4], randomBytes[5], randomBytes[6]); return guid; } public override bool GeneratesTemporaryValues => false;}
与SqlServer提供者同理,值生成器附加到MysqlValueGeneratorSelector,MysqlValueGeneratorSelector又附加到 AddEntityFramwrokMySql中,AddEntityFramwrokMySql又被附加到AppServices中。
总结
我们了解到了EF的数据库提供者使用值生成器的原理,知道了每个数据库的Guid算法不一样。还了解到数据库提供者的帮助,我们使用EF时不用过多的关心,数据库数据类型值的生成方式。
环球热议:EF7数据库提供者的自定义值生成器
全球热议:Use CMake notes
ArrayList和LinkedList的区别
咬甲癖是心理疾病吗?咬甲癖怎么治疗?
皮肤剥离强迫症是什么?皮肤剥离强迫症怎么治疗?
中移动董事长喊话中小学必学编程:还有委员喊话取消英语主科学了没用 你支持谁?
【世界快播报】最受欢迎的豪华中大型SUV 新款宝马X5实车亮相:国产必卖爆
湖北省“最强9万元补贴”蔓延 云南东风本田抄作业:直补6万
热点在线丨比Dev渠道更“快”!微软为Windows新增Canary测试渠道
全球观热点:砸130亿元 日本又失败!新主力火箭发射后自毁 日本专家谈落后中国多少年
焦点!【ES三周年】Elasticsearch安全配置详解
时讯:【MRTK】修改 HoloLens 应用的默认系统设置
新动态:开心档之Python3 面向对象
面试官要你介绍项目,怎么说?
每日速读!git的使用(一篇非常好的文章)
【快播报】老杜带你从零入门MyBatis,学MyBatis看这篇就够了!
bt种子是什么意思?bt种子怎么变成文件?
怎么查询手机号的号主姓名?怎么查询手机号用了多少年?
cpu怎么看性能参数?cpu检测软件哪个好?
车主称极氪001空调喷白粉末 官方回应:符合国标没有损害
世界今热点:育碧参与 巴黎圣母院加速修复:力争明年重新开放
世界速看:为什么小米手机不在美国卖?看完原因对雷军更有好感
天天快看:魅族20 Pro真机照出炉:“纽扣”四摄有意思
今日聚焦!《卧龙》超猛玩家穿着内裤打Boss 张梁吕布都无奈了
传真机是干什么用的?怎么发传真?
吉吉影音是什么?吉吉影音手机版离线缓存怎么用?
【世界播资讯】封装发送短信功能的封装过程
快报:什么是流程图?一篇文章就帮你搞定了
建立私人知识网站 cpolar轻松做到1 (部署DokuWiki)
热点!cad块属性定义及应用
叶辰是什么电视剧
环球观速讯丨迷惑行为!女司机给奥迪Q3加玻璃水:一股脑全倒进机油壶
天天热门:猪肉含量≥85% 一口全是肉:亚明猪肉烤肠2斤29.9元发车
全球最资讯丨看片、下载神器!四盘位NAS极空间Z4s史低价:2899元
世界即时:阿里影业总裁谈《长空之王》:展现了我们的意志力和信心
焦点!东风系疯狂补贴!雪铁龙、标致、本田大降价:12万能买C级轿车
天天简讯:长沙银行:向不特定对象发行可转债申请获上交所受理
全球百事通!tabby美观且实用的终端工具(windows/macos版 ,亲测有效!!!)
Spring6超全面教程,老杜带你玩转Spring6
更改windows桌面路径的教程
全球速读:亲测可用,ChatGPT 对话技巧
男子临时起意偷井盖 外卖小哥挺身而出上前制止
聚焦:N卡CPU占用率高的bug确认了 NVIDIA表态:即将修复
世界看点:中国著名雷达专家王小谟逝世 享年84岁
每天暴卖7000辆 但比亚迪的“卷杀”还没有要停下来的意思
世界关注:古巴一波音737客机撞鸟 引擎起火客舱浓烟弥漫
今日报丨开心档之Java 9 新特性
中信证券:海外锂价对国内出现明显溢价或对锂价形成支撑
全球快看:没商量余地!日本核污水排海将影响整个生物圈 海产品或都有辐射
《最后生还者》收视率再创新高
四川大学生组团去工地吃饭:13块随便吃 好吃又实惠
天天热文:浅谈基于Web的跨平台桌面应用开发
环球视讯!聊聊消息队列中的基础概念
今日热议:吉利汽车2月销量10.87万辆 极氪同比增长87% 可自主选择是否开启单踏板
全球信息:苹果iPhone掉熊窝被叼走 第一视角记录血盆大口
快报:荣耀赵明:苹果还是行业标杆 向苹果致敬 然后超越
环球快看:人口不断下降!一周工作时间增至69小时 韩国打工人也要迎来996
6g是什么概念
简讯:父母不给买鞋28岁女儿瞬间崩溃 跪地哀求200块都不给我花:网友感叹
天天新资讯:python-模块与包
男子在LV官网买包近2年未发货:最后商家取消订单
【快播报】男子挑战18元5片天价土豆火锅店:最后点了5盘土豆吃到崩溃
今日热讯:小伙早餐喝下20个生鸡蛋 网友:是个狠人 上一个这么喝的是周润发
环球热讯:弹幕也要放广告?!还能不能让人好好看剧了
视讯!避免延期发售?曝《GTA6》可能削减本体内容移到后续DLC
焦点热议:公称抗拉强度值_公称抗拉强度
教你用QQ邮箱如何发送文件
天天速看:南昌工学院开展“保护母亲河,争当河小青”净滩环保志愿活动
天天关注:收到背去世老人下楼订单?顺丰回应引围观 网友感叹这单也敢接
每日速读!拒绝ChatGPT后:苹果光速反悔
观众对《最后生还者》真人剧选角不满:女演员与想象不符
每日速讯:女子入职10天因老板娘不同意被开除:当事人感觉“很离谱”
2-高级特性
入门云原生,你需要了解的基础知识
俄罗斯国产新电脑启用!搭载自研8核ARM处理器、运行Linux定制系统
西班牙推出3D打印植物肉:模拟真肉口感
世界快消息!iOS从安卓抄来的这5个功能:苹果用户直呼真香?
世界快消息!学生免费领取7个月云服务器
每天吃的盐:一步步伤害你的身体
女子爱吃生腌海鲜:胆管长满活虫和虫卵
世界实时:iQOO Z7系列配置泄露:最高骁龙782G、支持120W闪充
精彩看点:地方融资平台
环球简讯:郑东新区“红立方·楼事会”荣获全市基层党建“十佳书记项目”
数据漂移问题及解决方案
全球新资讯:(数据库系统概论|王珊)第十章数据库恢复技术-第三节:故障种类
今日热搜:一次Java服务内存过高的分析过程
超划算!冷酸灵泵式牙膏5件套39元发车(送牙刷+漱口水)
天天热点!M.2 SSD秒变移动硬盘!酷冷至尊神钥Air图赏
焦点速讯:亚航被曝行李超重5公斤补收1807元:拍照被威胁不要上飞机
【全球新要闻】极氪官方二手车上线:不以盈利为目的 只收12万公里0事故车辆
精选!安卓“女皇”王雪红爆料苹果MR头显最快年中发布:HTC不担心竞争
环球视点!统一日志输出打印POST请求参数
法系车疯狂降价 12万买C级车雪铁龙C6!有销售一天卖车150多台
热点聚焦:豆瓣评分仅6.0:《蚁人3》周末北美票房暴跌61%
资讯:淄博烧烤店开门一分钟坐满大学生:组团去山东撸串火出圈
699元起 荣耀手表GS 3i发布:14天长续航、支持血氧监测
《巫师3》叶奈法玩偶推出:真人尺寸 能替换服饰
全球速看:stegsolve与zsteg的使用
环球即时:用线性二次模型建模大型数据中心,基于 MPC 进行冷却控制
环球头条:2023,大前端技术趋势及小程序未来分析