码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-02-03 14:03:12      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:ima   应用程序   get   目录   歌词   mod   增强   赋值   tps   

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

  • 中文版:https://docs.microsoft.com/zh-cn/ef/core/modeling/backing-field
    支持字段允许 EF 读取和/或写入字段而不是一个属性。 在类中的封装用于限制的使用和/或增强围绕访问数据的语义由应用程序代码,但值应进行读取和/或写入到数据库而无需使用这些限制时这很有用 /增强功能。
  • 英文版:https://docs.microsoft.com/en-us/ef/core/modeling/backing-field
    Backing fields allow EF to read and/or write to a field rather than a property. This can be useful when encapsulation in the class is being used to restrict the use of and/or enhance the semantics around access to the data by application code, but the value should be read from and/or written to the database without using those restrictions/enhancements.

它可以用于什么场景呢?简单地说,当我们没有特别地指定类的属性与数据表字段名的话,在装载 数据表的内容 到 类 的时候,EFCore会直接地找到属性名对应的数据表字段名,然后把字段的内容赋值到类属性中(留意,我说的是 类 的 属性 Property,而不是 字段 Field)。但是万一我们不想EFCore这样做呢?例如,以下的俩场景:
- 场景一
我们有一个User类,它有一个叫Password的属性,由于是单向加密,所以希望:每次对它赋值的时候,它都自动做MD5加密;然后对它读取的时候,它都只返回MD5加密后的内容(而不是加密前的内容)
- 场景二
某些金融应用,由于需要支持不同货币品种的小数点后位数精度的要求,金额在数据库储存的时候,或者和内部其他系统做数据交换的时候(通常极有可能是近似于整表导出了),都是整型。然后只有在人机对话的界面,才把进行小数点运算后的结果显示出来。至于货币品种,除了世界各国的货币,还可能会有虚拟货币(你懂得),所以小数点后位数的需求都不一样的啊。

(本篇的例子的程序,可以从 https://github.com/kentliu2007/EFCoreDemo/tree/master/BackingField 下载,建议可以下载后对照着代码来阅读本篇。我用的是 VS2017)

按照上述场景的需求,我们有:

  • 数据表:
    • Users
      技术图片
      技术图片
      技术图片
    • Clients, ClientAccountBalance, Currencies
      技术图片
      • Clients 的索引
        技术图片
        技术图片
      • ClientAccountBalance 的索引
        技术图片
      • Currencies 的索引
        技术图片
        技术图片
  • 测试数据:
    技术图片

  • EF6的实现方式
    让我们先来看看如果用EF6怎么做?EF6的话,有设计器啊,轻松容易,毫无压力:
    • 项目:
      技术图片
    • EF Model Diagram:
      技术图片
    • ClientAccountBalance的设置:
      技术图片
      rawAmount的设置,setter和getter都是internal的,因为这个是非 对外(public)属性
      技术图片
    • User的设置:
      技术图片
      rawPassword的设置,setter和getter都是internal的,因为这个是非 对外(public)属性
      技术图片
    • 针对场景一的,在Custom目录下,User类的代码:
      技术图片
    • 针对场景二的,在Custom目录下,ClientAccountBalance类的代码:
      技术图片

大功告成,简单吧?

  • EFCore的实现方式
    EFCore没有设计器,难道就“臣妾做不到”了吗?其实,借助Backing Fields的话,用EFCore来实现,更简单,更优雅
    • Backing Fields两个主要用法:
      在 DbContext.OnModelCreating方法里面,
      • 告诉EFCore,指定 类 的 某个Property,所对照的 类 的 Field 是哪个,且还可以指定它所对照的数据表的字段名:
      modelBuilder.Entity<MyEntity>().Property(b => b.MyProperty).HasField("_myField").HasColumnName("ColumnName");
      • 告诉EFCore,类 的 某个Field ,它所对照的数据表的字段名:
      modelBuilder.Entity<MyEntity>().Property("_myField").HasColumnName("ColumnName");
    • 项目:
      技术图片

    • DbContext的程序(Backing Fields出没,请注意):
      技术图片

    • 针对场景一的,User的程序:
      技术图片

    • 针对场景二的,ClientAccountBalance的程序:
      技术图片

搞定了。单刀直入,简单利索。对吧?
真的就可以吗?好吧,如果不信的话,可以下载代码,跑一下 单元测试 来体验一下嘛 :-P 。

在幕后英雄Backing Fields的帮助下,我们轻轻松松地用几行代码就搞定了上述两个情景的栗子了(重点在 DbContext 程序里面啊)。很棒,对吧?

下一篇,我将会分享一下,怎样在 EFCore上,借助它的 Lazy Loading 来实现,在 EF5/6 上面轻松地用 Table Mapping就实现了的 Entity Split 功能。
明年(今天是年二九嘛)见 :-D

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

标签:ima   应用程序   get   目录   歌词   mod   增强   赋值   tps   

原文地址:https://www.cnblogs.com/fatkent/p/10348864.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!