asp.net core系列 25 EF模型配置(隐藏属性)
一. 隐藏属性概述
隐藏属性也叫影子属性,该属性不是在.net实体类中定义的属性,而是在efcore模型中为该实体类型定义的属性。这些属性的值和状态完全在变更跟踪器中维护。它有二个功能:(1)当数据库中某些字段不想映射到实体类上公开的属性时,隐藏属性非常有用。(2)隐藏属性通常是用于外键属性,其中两个实体之间的关系由数据库中的外键值表示,但是两个实体关系是使用实体类型之间的导航属性进行管理(这个在下面约定中讲到)。
隐藏属性值可以通过changetracker api获取和更改:
context.entry(myblog).property("lastupdated").currentvalue = datetime.now;
下面讲第一个功能:当数据库中某些字段不想映射到实体类上公开的属性时,隐藏属性非常有用
1.1 配置隐藏属性
不能通过数据注释来创建隐藏属性,只能通过 fluent api 来创建, blog实体中没有映射lastupdated公开属性,但创建了隐藏属性。
class bloggingcontext: dbcontext { public dbset<blog> blogs { get; set; } protected override void onmodelcreating(modelbuilder modelbuilder) { modelbuilder.entity<blog>().property<datetime>("lastupdated"); } } public class blog { public int blogid { get; set; } public string url { get; set; } }
1.2 设置隐藏属性值
在新增时blog一条数据时,通过changetracker api可以为隐藏属性lastupdated设置时间值,提交到数据库表中。
[httppost] public async task<iactionresult> create([bind("url")] blog blog) { if (modelstate.isvalid) { //设置隐藏属性的值 bloggingcontext.entry(blog).property("lastupdated").currentvalue = datetime.now; bloggingcontext.add<blog>(blog); await bloggingcontext.savechangesasync(); } return view(); }
1.3 读取blog表数据
可以通过 linq 查询中引用隐藏属性ef.property
静态方法,通过隐藏属性lastupdated排序,读取blog集合数据。
var blogs = context.blogs.orderby(b => ef.property<datetime>(b, "lastupdated"));
二.约定
下面讲第二个功能,隐藏属性通常用于外键属性。当二个实体存在主从关系,但在依赖实体类中找不到外键属性时,默认是通过"约定"来创建隐藏外键属性的。隐藏外键属性将被命名为<navigation property name><principal key property name>。以下面的示例来说:post依赖实体中包含了隐藏的外键属性 “
blogid ”。
public class blog { public int blogid { get; set; } public string url { get; set; } public list<post> posts { get; set; } } public class post { public int postid { get; set; } public string title { get; set; } public string content { get; set; } public blog blog { get; set; } }
下面简单测试下,通过初例化一个的post依赖实体,查看该实例中是否包含了blogid 外键隐藏属性,通过changetracker api来获取,使用断点查看该blogid 隐藏属性确实存在,只是在post实体上是非公开的外键属性:
public void onget() { object obj = _bloggingcontext.entry(new post()).property("blogid").currentvalue; }
_bloggingcontext.entry(new post()).property("blogid") {microsoft.entityframeworkcore.changetracking.propertyentry} currentvalue: null entityentry: {microsoft.entityframeworkcore.changetracking.internal.internalmixedentityentry} internalentry: {microsoft.entityframeworkcore.changetracking.internal.internalmixedentityentry} ismodified: false istemporary: false metadata (microsoft.entityframeworkcore.changetracking.memberentry): {property: post.blogid (no field, nullable<int>) shadow fk index 1 1 1 0 1} metadata: {property: post.blogid (no field, nullable<int>) shadow fk index 1 1 1 0 1} originalvalue: null
参考文献:
官方文档:ef 隐藏属性
推荐阅读
-
asp.net core系列 24 EF模型配置(主键,生成值,最大长度,并发标记)
-
asp.net core 系列 20 EF基于数据模型创建数据库
-
asp.net core系列 29 EF模型配置(查询类型,关系数据库建模)
-
asp.net core系列 23 EF模型配置(概述, 类型和属性的包含与排除)
-
(19)ASP.NET Core EF创建模型(包含属性和排除属性、主键、生成的值)
-
asp.net core系列 26 EF模型配置(实体关系)
-
(20)ASP.NET Core EF创建模型(必需属性和可选属性、最大长度、并发标记、阴影属性)
-
asp.net core系列 28 EF模型配置(字段,构造函数,拥有实体类型)
-
asp.net core系列 25 EF模型配置(隐藏属性)
-
asp.net core系列 27 EF模型配置(索引,备用键,继承)