本章的方法探讨一些可以应用于对象和实体框架的流程定制。这些方法涵盖了许多“幕后”的东西,它可以使你的代码更统一,比如通过更关注应用程序核心业务规则执行的细节,应用范围更广泛。我们开始本章的一个方法,告诉你如何拥有自己的代码执行SaveChanges()在您的应用程序中。如果你想在你的应用程序中从一个单一的点执行业务规则,那么这个方法和一些其他的特别有用的。在其他的方法中,我们将向您展示如何跟踪数据库连接,如何自动响应收集更改,如何实现级联删除,如何分配默认值,以及如何使用强类型XML属性。所有这些方法的共同点是延伸在实体框架的对象和过程使你的代码更具弹性的,均匀的,和可维护性。

执行代码在SaveChange()时被调用

问题

  你要执行的代码都是在数据上下文savechanges()执行时被调用

解决方案

  让我们说,你有一个模型,代表一个求职者。作为该模型的一部分,您希望将包含申请人的简历的文件被删除时,申请人的记录被删除。你可以在你的应用程序中找到每一个地方,你需要删除一个申请人的记录,但你想要一个更一致和统一的方法。

  为了确保申请人的简历文件被删除时,申请人被删除,则在DbContext中从写SavingChanges()方法。在我们的方法中,我们需要监测DbContext的改动,包括删除申请人实体的实例。接下来我们需要告诉实体框架通过调用真正的savechanges()方法保存更改。最后,对于每一个已删除的申请人,我们需要删除相关的简历文件。

using (var context = new School5Entities())
{
var path1 = "Alex Jones.txt";
File.AppendAllText(path1, "Alex Jones\n Resume\n...");
var path2 = "Janis Rogers.txt";
File.AppendAllText(path2, "Janis Rodgers\n Resume\n...");
var app1 = new Applicant
{
Name = "Alex Jones",
ResumePath = path1
};
var app2 = new Applicant
{
Name = "Janis Rogers",
ResumePath = path2
};
context.Applicants.Add(app1);
context.Applicants.Add(app2);
context.SaveChanges();
// delete Alex Jones
context.Applicants.Remove(app1);
context.SaveChanges(); }
  public override int SaveChanges()
{
Console.WriteLine("Saving Changes...");
var applicants = this.ChangeTracker.Entries().Where(e => e.State == System.Data.Entity.
EntityState.Deleted).Select(e => e.Entity).OfType<Applicant>().ToList();
Console.WriteLine("\n{0} applicants deleted",
applicants.Count().ToString());
foreach (var app in applicants)
{
File.Delete(app.ResumePath);
Console.WriteLine("\n{0}'s resume at {1} deleted",
app.Name, app.ResumePath);
}
int changes = base.SaveChanges();
return changes;
}

运行结果:

《Entity Framework 6 Recipes》中文翻译——第十二章自定义EntityFramework对象(一)的更多相关文章

  1. 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述

    微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...

  2. 《Entity Framework 6 Recipes》翻译系列(2) -----第一章 开始使用实体框架之使用介绍

    Visual Studio 我们在Windows平台上开发应用程序使用的工具主要是Visual Studio.这个集成开发环境已经演化了很多年,从一个简单的C++编辑器和编译器到一个高度集成.支持软件 ...

  3. 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

    第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...

  4. 《Entity Framework 6 Recipes》翻译系列 (4) -----第二章 实体数据建模基础之从已存在的数据库创建模型

    不知道对EF感兴趣的并不多,还是我翻译有问题(如果是,恳请你指正),通过前几篇的反馈,阅读这个系列的人不多.不要这事到最后成了吃不讨好的事就麻烦了,废话就到这里,直奔主题. 2-2 从已存在的数据库创 ...

  5. 《Entity Framework 6 Recipes》翻译系列 (5) -----第二章 实体数据建模基础之有载荷和无载荷的多对多关系建模

    2-3 无载荷(with NO Payload)的多对多关系建模 问题 在数据库中,存在通过一张链接表来关联两张表的情况.链接表仅包含连接两张表形成多对多关系的外键,你需要把这两张多对多关系的表导入到 ...

  6. Gradle 1.12 翻译——第十二章 使用Gradle 图形用户界面

    有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...

  7. Gradle 1.12用户指南翻译——第二十二章. 标准的 Gradle 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  8. 第三部分:Android 应用程序接口指南---第二节:UI---第十二章 自定义组件

    第12章 自定义组件 Android平台提供了一套完备的.功能强大的组件化模型用于搭建用户界面,这套组件化模型以View和 ViewGroup这两个基础布局类为基础.平台本身已预先实现了多种用于构建界 ...

  9. 第十二章:window对象

    第十一章介绍了window对象及其客户端javascript所扮演的核心角色:它是客户端javascript程序的全局对象.本章介绍window对象的属性和方法,这些属性定义了不同的API,但是只有一 ...

随机推荐

  1. Tkinter教程之Listbox篇

    本文转载自:http://blog.csdn.net/jcodeer/article/details/1811310 #Tkinter教程之Listbox篇#Listbox为列表框控件,它可以包含一个 ...

  2. Ruby多字节字符的设计

    Perl.Python的多字节字符处理方式是UCS(Universal Code Set),Ruby的多字节字符处理方式是CSI(Code Set Independent).UCS的做法是,不管你读取 ...

  3. struts2中访问和添加Application、session以及request属性

    一.访问或添加Application.session.request属性 <一>方式一 HelloWorldAction类中添加如下代码 //此方法适用于仅对Application.ses ...

  4. Things App Engine Doesn't Do...Yet

    当人们第一次使用App Engine的时候,他们会问一些App Engine不会做的事情.其中的一些事情Google在不久的将来会实现的,还有一些违背了App Engine设计的本质,将不可能增加(到 ...

  5. 多线程之 CountDownLatch

    CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. CountDownLatch如其所写,是一个倒计数的锁存器,当计数减至0时触发特定 ...

  6. 批量ping主机脚本

    #! /bin/bash for i in `cat test.list`do   host=`echo $i|awk -F"," '{print $1}'`   app_IP=` ...

  7. 从根源上解析 Java volatile 关键字的实现

    1.解析概览 内存模型的相关概念 并发编程中的三个概念 Java内存模型 深入剖析Volatile关键字 使用volatile关键字的场景 2.内存模型的相关概念 缓存一致性问题.通常称这种被多个线程 ...

  8. HDU 5816 Hearthstone (状压DP)

    Hearthstone 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5816 Description Hearthstone is an onlin ...

  9. Java IO (3) - Reader

    Java IO (3) - Reader 前言 JavaIO一共包括两种,一种是stream,一种是reader/writer,每种又包括in/out,所以一共是四种包.Java 流在处理上分为字符流 ...

  10. UVA 624 - CD (01背包 + 打印物品)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...