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 ...
随机推荐
- 【.net 深呼吸】细说CodeDom(1):结构大观
CodeDom 是啥东东?Html Dom听过吧,XML Dom听过吧.DOM一般可翻译为 文档对象模型,那 Code + DOM呢,自然是指代码文档模型了.如果你从来没接触过 CodeDom,你大概 ...
- Android请求网络共通类——Hi_博客 Android App 开发笔记
今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...
- 【AR实验室】ARToolKit之概述篇
0x00 - 前言 我从去年就开始对AR(Augmented Reality)技术比较关注,但是去年AR行业一直处于偶尔发声的状态,丝毫没有其"异姓同名"的兄弟VR(Virtual ...
- Hibernatel框架关联映射
Hibernatel框架关联映射 Hibernate程序执行流程: 1.集合映射 需求:网络购物时,用户购买商品,填写地址 每个用户会有不确定的地址数目,或者只有一个或者有很多.这个时候不能把每条地址 ...
- .NET里简易实现AOP
.NET里简易实现AOP 前言 在MVC的过滤器章节中对于过滤器的使用就是AOP的一个实现了吧,时常在工作学习中遇到AOP对于它的运用可以说是很熟练了,就是没想过如果自己来实现的话是怎么实现的,性子比 ...
- Mysql命令大全
格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输 ...
- Python爬虫小白入门(四)PhatomJS+Selenium第一篇
一.前言 在上一篇博文中,我们的爬虫面临着一个问题,在爬取Unsplash网站的时候,由于网站是下拉刷新,并没有分页.所以不能够通过页码获取页面的url来分别发送网络请求.我也尝试了其他方式,比如下拉 ...
- 【C#公共帮助类】 Utils 10年代码,最全的系统帮助类
为大家分享一下个人的一个Utils系统帮助类,可能有些现在有新的技术替代,自行修改哈~ 这个帮助类主要包含:对象转换处理 .分割字符串.截取字符串.删除最后结尾的一个逗号. 删除最后结尾的指定字符后的 ...
- 根据ip判断返回城市名称查询当地天气
<?phpheader("content-type:text/html;charset=utf-8");date_default_timezone_set("Asi ...
- BridgePattern(桥接模式)
/** * 桥接模式 * @author TMAC-J * 应用于多维度方案 * 用组合的形式代替继承 * 符合单一职责原则 * 一个类只有一个引起他变化的原因 * 增加程序灵活性 */ public ...