Entity Framework Core如何生成列并跟踪列记录
导读:本文共3943字符,通常情况下阅读需要13分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 注意:我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final)。正式版发布时,功能可能存在变动。当您设计数据库时,有时需要添加列以跟踪记录何时更改,以及谁进行了更改。例如,您添加以下列:CreatedAtCreatedByLastUpdatedAtLastUpdatedBy您可以轻松地使用默认值和触发器来处理C... ...
目录
(为您整理了一些要点),点击可以直达。注意:我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final)。正式版发布时,功能可能存在变动。
当您设计数据库时,有时需要添加列以跟踪记录何时更改,以及谁进行了更改。例如,您添加以下列:
CreatedAt
CreatedBy
LastUpdatedAt
LastUpdatedBy
您可以轻松地使用默认值和触发器来处理CreatedAt
和LastUpdatedAt
列。老实说,创建触发器是件无聊的事情,你也不想自己做。此外,很难设置用户名,因为它是应用程序的信息;实际上,在Web程序的上下文中,它们只是连接到数据库的一个用户,因此,您无法使用数据库中CURRENT_USER
函数设置跟踪列的值。
当然,您不想访问这个属性。相反,您希望 Entity Framework 为您自动执行,所以,解决的办法是调用SaveChanges
或SaveChangesAsync
方法之前自动设置这些属性的值。在模型中有多种方法处理这些属性:您可以在模型中添加读写(R/W)属性;您也可以使用只读(R/O)属性;还有一种方案,您可以使用阴影(Shadow)属性。在最后一种方案中,是将列不映射到模型中的属性,只有 Entity Framework 才知道这些属性。是的,EF Core 非常灵活:)
我们用 Entity Framework 实现这3种方案!
在这种情况下,实体将具有读/写属性。这意味着,您可以在代码中更改属性的值。
现在,我们将更改SaveChanges
方法的默认行为来设置跟踪属性的值。要小心,有两个方法要重写:SaveChanges
和异步方法SaveChangesAsync
。在代码中遍历上下文中跟踪的实体,并根据状态设置跟踪属性的值。代码非常简单:
这个方案有个不容忽视的问题,属性是可写的,您不希望在代码中设置属性的值。让我们看看如何使用只读属性。
Entity Framework Core 允许将列映射到字段。这样,您可以使用只读属性,我们来修改Post
类:
上面的代码有点麻烦,但属性现在是只读的。您需要指引 Entity Framework 使用这些字段来设置列的值。
您不能像以前那样实现OnBeforeSaving
方法,因为属性没有setter
。不过,您可以使用ChangeTracker
来指引 Entity Framework 为属性设置值。这种方式无需访问属性或字段。
我认为应是使用的方式,因为这种方式很清晰。
在某些情况下,您可能需要设置列的值而不在模型中定义属性。例如,您可能会公开最后更新的日期,但不会显示谁做了更改。Entity Framework Core 可以通过使用阴影(Shadow )属性来处理这个。阴影属性在OnModelCreating
方法中声明,但在类中不存在。您可以使用ChangeTracker
读取和写入阴影属性的值。
Entity Framework Core如何生成列并跟踪列记录的详细内容,希望对您有所帮助,信息来源于网络。