《Entity Framework 6 Recipes》中文翻译——第十二章自定义EntityFramework对象(一)
本章的方法探讨一些可以应用于对象和实体框架的流程定制。这些方法涵盖了许多“幕后”的东西,它可以使你的代码更统一,比如通过更关注应用程序核心业务规则执行的细节,应用范围更广泛。我们开始本章的一个方法,告诉你如何拥有自己的代码执行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; }
运行结果: