架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 15430|回复: 0

[资料] EF Core 系列(三)实体框架影子属性[转载]

[复制链接]
发表于 2021-2-7 14:15:08 | 显示全部楼层 |阅读模式
EF Core 系列(二)封装 OnModelCreating 利用反射创建索引等
https://www.itsvse.com/thread-9392-1-1.html

影子属性是未在 .NET 实体类中定义但在 EF Core 模型中为该实体类型定义的属性。 这些属性的值和状态纯粹在更改跟踪器中进行维护。 当数据库中的数据不应在映射的实体类型上公开时,阴影属性非常有用。
实体框架核心引入了一种新的属性类型,称为“影子”属性,该属性在EF 6.x中不存在。

阴影属性是未在.NET实体类中直接定义的属性。相反,您可以为实体数据模型中的特定实体类型配置它。可以在上下文类的OnModelCreating()方法中对其进行配置。

下图说明了shadow属性。

shadow-property.png

如上图所示,阴影属性不属于您的实体类。因此,您无法在访问实体的其他属性时访问它。阴影属性只能在构建实体数据模型时为实体类型配置,并且它们也将映射到数据库列。阴影属性的值和状态仅在更改跟踪器中维护。

让我们了解 shadow 属性的实际方面。假设我们需要维护数据库表中每个记录的创建和更新日期。您学习了如何通过定义实体类中的 CreatedDate 和 UpdatedDate 属性来设置 EF Core 中实体的创建和修改日期。在这里,我们将看到如何通过使用阴影属性而不在实体类中包含阴影属性来实现相同的结果。

考虑以下Student实体类。

上面的 Student 类不包含 CreatedDate 和 UpdatedDate 属性来维护创建或更新的时间。我们将它们配置为 Student 实体上的阴影属性。

定义阴影属性

您可以 OnModelCreating() 在Property() 方法中使用 Fluent API 为实体类型定义阴影属性。

以下配置两个阴影属性 CreatedDate 和 UpdatedDate 对 Student 实体。


如您所见,该 Property() 方法用于配置阴影属性。将 shadow 属性的名称指定为字符串,并将类型指定为通用参数。如果 Property() 方法中指定的名称与现有属性的名称匹配,则 EF Core 将将该现有属性配置为 shadow 属性,而不是引入新的 shadow 属性。

数据库中的阴影属性

定义阴影属性后,我们需要更新数据库架构,因为阴影属性将映射到相应的数据库列。

为此,请在 Visual Studio 的程序包管理器控制台中使用以下命令添加数据库迁移。


现在,该 Student 表将包括两列,CreatedDate 并且 UpdatedDate 在 SQL Server 中,如下所示。

shadow-property-in-db.png

因此,即使我们没有在 Student 类中包含这些属性并将其配置为阴影属性,数据库也将具有相应的列。

访问影子属性

您可以使用的 Property() 方法获取或设置阴影属性的值 EntityEntry 。以下代码访问 shadow 属性的值。

但是,在我们的场景中,我们想在 SaveChanges() 方法上自动将值设置为这些阴影属性,这样就不必在每个实体对象上手动设置它们。因此,在上下文类中重写 SaveChanges()方法,如下所示。

这将自动为 CreatedDate 和 UpdatedDate 阴影属性设置值。

现在,执行以下代码并检查数据库中的记录。


上面的代码将在 CreatedDate 和 UpdatedDate 中插入以下记录 Students。

db-record.png

因此,通过配置阴影属性,我们不必将它们包括在实体类中。

在所有实体上配置阴影属性

您可以一次在所有实体上配置阴影属性,而不是为所有实体手动配置它们。

例如,我们可以配置 CreatedDate 和 UpdatedDate 上一次的所有实体,如下图所示。


何时使用阴影属性?

阴影属性可以在两种情况下使用:

当您不想在映射的实体上公开数据库列时,例如上面讨论的方案。
当您不想公开外键属性而只想使用导航属性来管理关系时。外键属性将是shadow属性,并映射到数据库列,但不会作为实体的属性公开。(在EF Core中,如果您未在实体类中定义外键属性,则它将自动为此生成阴影属性。您无需手动配置外键属性。)


参考资料:

https://docs.microsoft.com/zh-cn/ef/core/modeling/shadow-properties
https://www.entityframeworktutorial.net/efcore/shadow-property.aspx




上一篇:MySQL 将查询结果导出到文件
下一篇:ASP.NET Core 使用 ViewComponent 视图组件教程
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-27 03:44

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表