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

刘德华 有一首歌叫《马桶》,其中有一句歌词是:每一个马桶都是英雄

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

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

时间: 2024-10-05 05:04:41

“幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】的相关文章

UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?

选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软推荐使用Sqlite吧! 2,简单!就只有一个类库没有多余的参照什么的.不像其他数据库还得做复杂配置什么的麻烦! 3,不需要数据库服务,数据服务和客户都在同一个进程里面.如下图: 4,作为存储系统它只支持一个用户一个数据实体. 5,跨平台跨结构,这个好! Sqlite主要使用内容 如果想充分使用好S

[UWP小白日记-11]在UWP中使用Entity Framework Core(Entity Framework 7)操作SQLite数据库(一)

前言 本文中,您将创建一个通用应用程序(UWP),使用Entity Framework Core(Entity Framework 7)框架在SQLite数据库上执行基本的数据访问. 准备: Entity Framework Core(Entity Framework 7)下文将简称:EF 1.在UWP中使用EF需要更新Microsoft.NETCore.UniversalWindowsPlatform到大于“5.2.2”的版本. 2.直接在“程序包管理器控制台”输入命令来更新:Update-P

使用Entity Framework Core Code First创建SQLite数据库

Entity Framework Core(以下简称"EF Core")支持多种数据库.在这篇文章中,我们看看如何使用EF Core的Code First方式创建SQLite数据库 下载SQLite,解压后会得到三个文件,放到c:\sqlite目录下 我们先创建一个.NET Core控制台程序 添加EF Core for SQLite组件库 "dependencies": { "Microsoft.EntityFrameworkCore.Sqlite&qu

全球首发免费的MySql for Entity Framework Core

from:http://www.1234.sh/post/pomelo-data-mysql?utm_source=tuicool&utm_medium=referral Source 源代码在GitHub中以MIT协议开源: Pomelo.Data.MySql Pomelo.EntityFrameworkCore.MySql Background 一时兴起,想实现.NET Core下的MySQL ADO层和与Entity Framework Core对接,同时也是非常鄙视某厂商借着目前Orac

Professional C# 6 and .NET Core 1.0 - 38 Entity Framework Core

本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处:Professional C# 6 and .NET Core 1.0 - 38 Entity Framework Core ----------------------------------------------------------------------- What's In This Chapter? Introducing Entity Framework Core 1.0 Using Depe

使用Visual Studio开发ASP.NET Core MVC and Entity Framework Core初学者教程

原文地址:https://docs.asp.net/en/latest/data/ef-mvc/intro.html The Contoso University sample web application demonstrates how to create ASP.NET Core 1.0 MVC web applications using Entity Framework Core 1.0 and Visual Studio 2015. Contoso University网络应用的案

【dotnet跨平台】微软昨天宣布正式发布.NET Core RC2和.NET Core SDK Preview 1,还有Entity Framework Core RC2

?? [dotnet跨平台]微软昨天宣布正式发布.NET Core RC2和.NET Core SDK Preview 1,还有Entity Framework Core RC2 期待已经的版本终于在昨天发布了 微软昨天宣布正式发布.NET Core RC2和.NET Core SDK Preview 1:https://blogs.msdn.microsoft.com/dotnet/2016/05/16/announcing-net-core-rc2/ 微软昨天宣布正式发布Entity Fra

Building a Web App with ASP.NET Core, MVC, Entity Framework Core, Bootstrap, and Angular

Since I have spent many years on Windows Application development in my first three years of software career.  I was interested in the C#, had tried to understand the basic knowledge about C#. The programs, the patterns, the object-oriented methodolog

Entity Framework Core 2.0 入门简介

不多说废话了, 直接切入正题. EF Core支持情况 EF Core的数据库Providers: 此外还即将支持CosmosDB和 Oracle. EFCore 2.0新的东西: 查询: EF.Functions.Like() Linq解释器的改进 全局过滤(按类型) 编译查询(Explicitly compiled query) GroupJoin的SQL优化. 映射: Type Configuration 配置 Owned Entities (替代EF6的复杂类型) Scalar UDF映