本章的方法探讨一些可以应用于对象和实体框架的流程定制。这些方法涵盖了许多“幕后”的东西,它可以使你的代码更统一,比如通过更关注应用程序核心业务规则执行的细节,应用范围更广泛。我们开始本章的一个方法,告诉你如何拥有自己的代码执行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. JAVA WEB SQLHelper类的封装

    在这次做项目中,我对自己最满意的就是封装了一下SQLHelper类,我对自己感到骄傲主要是 我是初学者,我刚开始不知道可以这样做,我只是想着试着去这样做了,结果真的可以,所以我 在我的模块就自己封装了 ...

  2. 第二百九十八天 how can I 坚持

    晚上和同学一块吃了个饭,聊了好多. 晚上回来的路上,突然想起一句话,现在又忘了. 睡觉. 人生平淡也好,光彩也罢,只是一个历程,算了,睡觉.

  3. Web开发人员需知的Web缓存知识

    最近的译文距今已有4年之久,原文有一定的更新.今天踩着前辈们的肩膀,再次把这篇文章翻译整理下.一来让自己对web缓存的理解更深刻些,二来让大家注意力稍稍转移下,不要整天HTML5, 面试题啊叨啊叨的~ ...

  4. 10个专属于移动app开发者的最佳移动JavaScript框架

    1.Titanium Mobile JavaScript Frameworks Titanium Mobile JavaScript框架是移动应用开发者(Android & iOS)首选的最优 ...

  5. hadoop conf中xml文件修改

    core-site.xml <?xml version="1.0"?><?xml-stylesheet type="text/xsl" hre ...

  6. Codeforces 599C Day at the Beach(想法题,排序)

    C. Day at the Beach One day Squidward, Spongebob and Patrick decided to go to the beach. Unfortunate ...

  7. eclipse中如何设置tomcat启动时间

    现象:在eclipse中启动tomcat总是提示“Server Tomcat v5.5 Server @ localhost was unable to start within 45 seconds ...

  8. Altium Desiger自定义BOM导出格式

    用Excel做一个xx.xlt的2003的模版文件,如名为:AltiumDesiger PCB BOM Template.xlt 将AltiumDesiger PCB BOM Template.xlt ...

  9. cocos2dx搭建开发环境

    windows7 64位 搭建cocos2dx 版本开发环境 目前cocos2dx分为2.x版本和3.x版本,搭建环境稍有不同 先搭建3.1版本win32开发环境 相关准备: 注意:安装路径尽可能不要 ...

  10. pymol编译

    https://pymolwiki.org/index.php/Linux_Install