Entity Framework 6 Recipes 2nd Edition(12-7)译 -> 设定默认值
12-7. 设定默认值
问题
在把一个实体保存到数据库之前,设置该实体属性的默认值
解决方案
假设你有一个如Figure 12-9所示的表, 它保存采购订单(purchase order). 主键PurchaseOrderId是一个GUID,有订单创建时间,最后修改时间,和备注,而且备注列不再使用,设置成 “N/A”.因为不用该列,所以在实体里也没有对应的属性. 你想初始化PurchaseOrderId 列, 两个日期时间列, Paid列, 和 comments 列为默认值. 我们的模型如 Figure 12-10所示.

Figure 12-10. The model created from the PurchaseOrder table in Figure 12-9

Figure 12-9. The PurchaseOrder table with several columns that need default values
我们将举例说明三种不同的方法来设置默认值. 默认值不用动态计算,属性会在概念层被设置为默认值. 选择Paid 属性在属性窗口查看它的所有属性. 会看到它的默认值为false.
对于在运行时需要计算值的属性我们需要override SaveChanges 事件.如Listing 12-7所示. 在这个事件里,如果对象的状态是 Added ,我们把 PurchaseOrderId 的值设置为一个新的GUID,和设置CreateDate 和ModifiedDate 字段.
为说明在模型概念之外设置默认值,我们通过修改存储层为列设置默认值,这种方式对于某些没出现在模型里的属性是非常有用的.
. 接下来通过模型层设置属性默认值 :右击.edmx 文件➤打开方式 ➤ XML 编辑器. 在.edmx 文件里SSDL节的<Property>标签下,为Comment属性添加DefaultValue="N/A".
Listing 12-7. 通过Override SaveChanges 事件设置默认值
class Program
{
static void Main(string[] args)
{
RunExample();
}
static void RunExample()
{
using (var context = new EFRecipesEntities())
{
context.PurchaseOrders.Add(
new PurchaseOrder { Amount = 109.98M });
context.PurchaseOrders.Add(
new PurchaseOrder { Amount = 20.99M });
context.PurchaseOrders.Add(
new PurchaseOrder { Amount = 208.89M });
context.SaveChanges();
}
using (var context = new EFRecipesEntities())
{
Console.WriteLine("Purchase Orders");
foreach (var po in context.PurchaseOrders)
{
Console.WriteLine("Purchase Order: {0}",
po.PurchaseOrderId.ToString(""));
Console.WriteLine("\tPaid: {0}", po.Paid ? "Yes" : "No");
Console.WriteLine("\tAmount: {0}", po.Amount.ToString("C"));
Console.WriteLine("\tCreated On: {0}",
po.CreateDate.ToShortTimeString());
Console.WriteLine("\tModified at: {0}",
po.ModifiedDate.ToShortTimeString());
}
}
}
}
public partial class EFRecipesEntities
{
public override int SaveChanges()
{
var changeSet = this.ChangeTracker.Entries().Where(e => e.Entity is PurchaseOrder);
if (changeSet != null)
{
foreach (var order in changeSet.Where(c => c.State == System.Data.Entity.
EntityState.Added).Select(a => a.Entity as PurchaseOrder))
{
order.PurchaseOrderId = Guid.NewGuid();
order.CreateDate = DateTime.UtcNow;
order.ModifiedDate = DateTime.UtcNow;
}
foreach (var order in changeSet.Where(c => c.State == System.Data.Entity.
EntityState.Modified).Select(a => a.Entity as PurchaseOrder))
{
order.ModifiedDate = DateTime.UtcNow;
}
}
return base.SaveChanges();
}
}
上述 Listing 12-7代码输出结果如下:
Purchase Orders
Purchase Order: 1b4df3c6-6f72-4c6b-9ce2-331bad509be5
Paid: No
Amount: $208.89
Created On: 3:15 PM
Modified at: 3:15 PM
Purchase Order: c042f045-38af-4bfc-93c0-a870ffd36195
Paid: No
Amount: $20.99
Created On: 3:15 PM
Modified at: 3:15 PM
Purchase Order: 223faf4a-e128-4f5a-8dee-b9b104ed43b7
Paid: No
Amount: $109.98
Created On: 3:15 PM
Modified at: 3:15 PM
原理
我们演示了三种不同的设置默认值的方法. 一个属性的默认值是静态的而且属性被实体所暴露,我们可以通过设计器设置.如Paid属性,而且把它的默认值设置为false是非常合适的,因为新的订单一般还没付款.对于那些需要动态计算的,如CreateDate, ModifiedDate, 和PurchaseOrderId属性,我们 override SaveChanges 事件来计算这些值并设置为它们的默认值再保存到数据库.最后, 对于没有出现在模型表面上的属性而且又需要一个静态的默认值, 我们可以使用在存储层用Default Value 属性来设置默认值, 在本小节,我们就是在存储层把 comments 的默认值设置为“N/A”.
还有一种设置默认值的做法,你可以在实体的构造函数中设置默认值.构造函数在每个实体被创建时会调用,包括从数据库实例化这些实体时,不过你得小心处理,不要重写数据库里之前保存的数据.
Entity Framework 6 Recipes 2nd Edition(12-7)译 -> 设定默认值的更多相关文章
- Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新
因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...
- Entity Framework 6 Recipes 2nd Edition(12-1)译 -> 当SaveChanges( ) 被调用时执行你的代码
第12章定制EF 在本章的小节里,定制实体对象和EF处理的一些功能.这些小节将涵盖很多”幕后”的事情,能让你的代码更加统一解决一些事情,比如用一个业务规则中心统一地为实体执行验证. 本章开始的小节,将 ...
- Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化
9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...
- Entity Framework 6 Recipes 2nd Edition(9-4)译->Web API 的客户端实现修改跟踪
9-4. Web API 的客户端实现修改跟踪 问题 我们想通过客户端更新实体类,调用基于REST的Web API 服务实现把一个对象图的插入.删除和修改等数据库操作.此外, 我们想通过EF6的Cod ...
- Entity Framework 6 Recipes 2nd Edition(13-4)译 -> 有效地创建一个搜索查询
问题 你想用LINQ写一个搜索查询,能被转换成更有效率的SQL.另外,你想用EF的CodeFirst方式实现. 解决方案 假设你有如下Figure 13-6所示的模型 Figure 13-6. A s ...
- Entity Framework 6 Recipes 2nd Edition(13-9)译 -> 避免Include
问题 你想不用Include()方法,立即加载一下相关的集合,并想通过EF的CodeFirst方式实现. 解决方案 假设你有一个如Figure 13-14所示的模型: Figure 13-14. A ...
- Entity Framework 6 Recipes 2nd Edition(目录索引)
Chapter01. Getting Started with Entity Framework / 实体框架入门 1-1. A Brief Tour of the Entity Framework ...
- Entity Framework 6 Recipes 2nd Edition(9-1)译->用Web Api更新单独分离的实体
第九章 在N层结构的应用程序中使用EF 不是所有的应用都能完全地写入到一个单个的过程中(就是驻留在一个单一的物理层中),实际上,在当今不断发展的网络世界,大量的应用程序的结构包含经典的表现层,应用程, ...
- Entity Framework 6 Recipes 2nd Edition(13-2)译 -> 用实体键获取一个单独的实体
问题 不管你用DBFirst,ModelFirst或是CodeFirst的方式,你想用实体键获取一个单独的实体.在本例中,我们用CodeFirst的方式. 解决方案 假设你有一个模型表示一个Paint ...
随机推荐
- 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑
阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...
- session实现购物车
为实现简单的购物功能(购物车添加.账户查看.购物车商品删除.实时的购物商品数量及价格的计算显示.购物车商品数量可手动输入等),用session实现了一简单的以php语言为基础.连接MySQL数据库的购 ...
- 分布式锁1 Java常用技术方案
前言: 由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题.所以自己结合实际工作中的一些经验和网上看到的一些资 ...
- 从Membership 到 .NET4.5 之 ASP.NET Identity
我们前面已经讨论过了如何在一个网站中集成最基本的Membership功能,然后深入学习了Membership的架构设计.正所谓从实践从来,到实践从去,在我们把Membership的结构吃透之后,我们要 ...
- ABP文档 - Javascript Api - Message
本节内容: 显示信息 确认 Message API给用户显示一个信息,或从用户那里获取一个确认信息. Message API默认使用sweetalert实现,为使sweetalert正常工作,你应该包 ...
- HTML5 介绍
本篇主要介绍HTML5规范的内容和页面上的架构变动. 目录 1. HTML5介绍 1.1 介绍 1.2 内容 1.3 浏览器支持情况 2. 创建HTML5页面 2.1 <!DOCTYPE> ...
- SQL Server-聚焦在视图和UDF中使用SCHEMABINDING(二十六)
前言 上一节我们讨论了视图中的一些限制以及建议等,这节我们讲讲关于在UDF和视图中使用SCHEMABINDING的问题,简短的内容,深入的理解,Always to review the basics. ...
- win8.1硬盘安装ubuntu14.04双系统
在网上找了很多方法都失败了,原因是大多数方法都是用mbr方式安装的,如grub4dos,easybcd.以至于连自己都怀疑win8能不能用硬盘安装,差点就去买个u盘来安装了,就在打算放弃的时候在ubu ...
- setCapture、releasCapture 浅析
1. setCapture 简介 setCapture可以将鼠标事件锁定在指定的元素上,当元素捕获了鼠标事件后,该事件只能作用在当前元素上. 以下情况会导致事件锁定失败: 当窗口失去焦点时,锁定的事件 ...
- 利用poi导出Excel
import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.r ...