最近在做公司的项目的时候,开始把部分程序迁移到EF Core,然后有了一些感触,趁着还没忘却,还是先记录下来。

EF Core还在成长中,我写这个的时候,版本是2.2。如果对着已有的EF 5/6来说,还有很多功能要迎头赶上的,所以这个也是为什么在.net core 3的标准中,计划要支持EF 6(这个其实是一次性买卖),就是想让大家可以先把.net Core (EF6)用起来,让EF Core先缓口气,等它成长足够了,再迁移到.net Core (EF Core)这样的组合。

即便如此,现在版本的EF Core已经有好多不少的闪亮之处(当然也有一些会因为自己没学好而误会了它的坑)。不论是闪亮点,还是坑,我有时间的话,会缓缓道来。

Shadow Properties这个特性很好,值得先拿出来说一下。但是博客本来就不适宜写得长,不然就不适合碎片阅读。所以我会把它分开来写。而且我还可能会比较啰嗦,有骗字数的嫌疑。

Shadow properties are properties that are not defined in your .NET entity class but are defined for that entity type in the EF Core model. The value and state of these properties is maintained purely in the Change Tracker. (https://docs.microsoft.com/en-us/ef/core/modeling/shadow-properties)

简单地说,隐藏属性 (Shadow Properties),就是那些逻辑设计里面没有的,但是物理设计里面却要有的属性。逻辑设计 vs. 物理设计,是做面向对象编程的攻城狮,都需要面对的问题。例如,那些数据库自增长的ID,审计类字段,还有例如做数据库订阅所需要的时间戳等等。很绕口,让我说人话,就是我们的business class(业务类),是不会包括那些只对照某数据库,或者中间件才冒出来的神马ID之类的属性,而我们却可以在EF Core层面,搞定这些ID的安置方式,而不需要另外再弄一个新的EF class。

有了这个,我们就可以保持逻辑设计的干净,也可以省了再去多弄一个EF Class。或者干脆就着EF Class来细细捣弄(为了继续保持逻辑层的干净)。后述的两种手法,在我们灵活运用EF 5/6的时候,已经屡见不鲜了。

简单举个几个栗子(边幅所限,本篇先来一个个简单的,后面的继续举拖沓的栗子,继续骗字数)。例如,我们会在数据库有一些 LastUpdateBy (记录最后修改者/兼顾新增此记录建立者)、LastUpdateDate(记录最后改动的日期和时间)、CreatedDate(新增此记录的日期和时间)等等,提供简单审计记录功能的字段。但是,我们的Class里面,真心不想要这些属性。这个时候,我们可以继续保持原有business class不变。而在我们的DBContext class的OnModuleCreating方法中,针对某个需要有上述审计字段的Entity,加上这些Shadow Properties。下面的代码片段的例子,只支持UpdateDate和UpdateBy,CreateDate请自行脑补哈(Tips: EntityState.Added 状态下才更新此属性的值)。

很简单对吧?只需要偷偷地在自己的DBContext里面捣弄一下,根本不需要让上层建筑知道那么多,我们就支持了仅在数据表里面才有的审计类字段。

接下来,下一篇,会举一个更啰嗦的栗子。解释一下,为什么我们的business class,不应该有那些由于物理设计(落地选型)所带出来的各式各样的神马ID,以及怎么用Shadow Properties来支持。但是因为这个涉及到asp.net core web api的相应改动,所以值得另开一个帖子来骗字数了。

原文地址:

https://www.cnblogs.com/fatkent/p/EFCore_ShadowProperties_1.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

Shadow Properties之美(一)【Microsoft Entity Framework Core随笔】相关推荐

  1. “幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】

    刘德华 有一首歌叫<马桶>,其中有一句歌词是:每一个马桶都是英雄. EFCore也有一个英雄,在幕后默默地任劳任怨.它就叫 "支持字段" (Backing Fields ...

  2. Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】

    接着上一篇Shadow Properties之美(一),我们来继续举一个有点啰嗦的栗子. 先看简单需求:某HR系统,需要记录员工资料.需要记录的资料有: 员工号(规则:分公司所在城市拼音首字母,加上三 ...

  3. 使用ASP.NET Core和Entity Framework Core实现Angular 7 SPA CRUD

    目录 Angular 7 Angular Core变化 Angular CLI更改 升级到Angular 7 添加新项目 创建新项目 使用Angular的前端设计和实现 添加模型和配置文件 添加Boo ...

  4. Entity Framework Core 2.0 使用入门

    本文转载自作者:晓晨Master(李志强) 原文章地址 https://www.cnblogs.com/stulzq/p/7717873.html 一.前言 Entity Framework(后面简称 ...

  5. Entity Framework Core介绍(1)

    介绍 Entity Framework (EF) Core 是轻量化.可扩展和跨平台版的常用 Entity Framework 数据访问技术. EF Core 可用作对象关系映射程序 (O/RM),以 ...

  6. oracle精简版_使用Entity Framework Core访问数据库(Oracle篇)

    前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架  终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...

  7. 在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句

    在开发中,我们想在调试中查看EF Core执行的sql语句,可以使用SQL Studio Manager Tools工具,另一种方式是使用EF Core提供的日志.在ASP.NET Core使用Ent ...

  8. 使用Entity Framework Core访问数据库(DB2篇)

    上一篇讲了一些EF Core访问Oracle的坑.(感兴趣请移步:使用Entity Framework Core访问数据库(Oracle篇)) 这篇主要讲一下关于EF Core访问DB2的一揽子~问题 ...

  9. 使用Entity Framework Core访问数据库(Oracle篇)

    前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架  终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...

最新文章

  1. 为什么不推荐使用uuid或者雪花id作为主键?
  2. 学机器学习有必要懂数学吗?深入浅出机器学习与数学的关系附教程
  3. 软件开发本质论——自然之路
  4. 【数据竞赛】99%情况下都有效的特征筛选策略--Null Importance。
  5. ExtJs 备忘录(2)—— Form表单(二) [ 控件封装 ]
  6. 第七章:在Spark集群上使用文件中的数据加载成为graph并进行操作(3)
  7. mac下nvm_2021 搞个 Mac 玩玩吧!
  8. Python基于seaborn绘制喜欢的热力图,不同色系一览
  9. VRF抽签与投票的思考
  10. java 爬虫爬取糗事百科热图图片
  11. HR面必问问题——和HR斗智斗勇(数字IC,FPGA,计算机,JAVA,算法,C++,产品,芯片通用)
  12. 华为手机比较好用的三款推荐
  13. php中预定义常量的,php预定义常量_PHP教程
  14. Android布局原理与优化
  15. 流媒体协议之RTMP详解
  16. 用mask-rcnn训练自己的数据
  17. 【转】好资料,非常棒!!!
  18. 开源,阿里内部Spring Cloud Alibaba微服务神仙文档(全彩版)
  19. Eclipse折叠代码插件folding 推荐
  20. 左手猎人游戏本,右手智能手表,荣耀如此长袖善舞

热门文章

  1. 可执行文件添加快捷方式_如何停止Windows向快捷方式文件名添加“-快捷方式”...
  2. ubuntu系统备份和还原_如何使用Aptik在Ubuntu中备份和还原您的应用程序和PPA
  3. 升级MariaDB为10.1版本
  4. linux批量分发必会面试题,通过邮件反馈结果。
  5. 898A. Rounding#数的舍入
  6. swf 文件在线播放的,怎么能够下载呢?(除视频外其它都可)
  7. mysql 批量更新和批量插入
  8. 许可证( License LicenseLicenseLicenseLicenseLicense)服务器配置
  9. C#解析Markdown文档,实现替换图片链接操作
  10. 基于ASP.NET Core api 的服务器事件发送