zoukankan      html  css  js  c++  java
  • Entity Framework 6 Recipes 2nd Edition(12-3)译 -> 数据库连接日志

    12-3. 数据库连接日志

    问题

    你想为每次与数据库的连接和断开记录日志

    解决方案

    EF为DbContext的连接公开了一个StateChange 事件.我们需要处理这个事件, 为每次与数据库的连接和断开记录日志.

    假设我们的模型如Figure 12-3所示. 在 Listing 12-3代码里, 我们创建一些Donation 实例,然后把它们保存到数据库. 这里的代码实现override SaveChanges() 方法为我们的StateChange 事件提供切入点.

     

    Figure 12-3. The model with the Donation entity

     

    Listing 12-3. Code to Implement Logging of Open and Close of a Database Connection

        class Program

        {

            static void Main(string[] args)

            {

                RunExample();

            }

            static void RunExample()

            {

                using (var context = new EFRecipesEntities())

                {

                    context.Donations.Add(new Donation

                    {

                        DonorName = "Robert Byrd",

                        Amount = 350M

                    });

                    context.Donations.Add(new Donation

                    {

                        DonorName = "Nancy McVoid",

                        Amount = 250M

                    });

                    context.Donations.Add(new Donation

                    {

                        DonorName = "Kim Kerns",

                        Amount = 750M

                    });

                    Console.WriteLine("About to SaveChanges()");

                    context.SaveChanges();

                }

                using (var context = new EFRecipesEntities())

                {

                    var list = context.Donations.Where(o => o.Amount > 300M);

                    Console.WriteLine("Donations over $300");

                    foreach (var donor in list)

                    {

                        Console.WriteLine("{0} gave {1}", donor.DonorName,

                        donor.Amount.ToString("C"));

                    }

                }

                Console.WriteLine("Press any key to close...");

                Console.ReadLine();

            }

        }

        public partial class EFRecipesEntities

        {

            public override int SaveChanges()

            {

                this.Database.Connection.StateChange += (s, e) =>

                {

                    var conn = (DbConnection)s;

                    Console.WriteLine("{0}: Database: {1}, State: {2}, was: {3}",

                    DateTime.Now.ToShortTimeString(), conn.Database,

                    e.CurrentState, e.OriginalState);

                };

                return base.SaveChanges();

            }

    }

    上述Listing 12-3代码输出如下:

    About to SaveChanges()

    09:56 : Database: EFRecipes, State: Open, was: Closed

    09:56: Database: EFRecipes, State: Closed, was: Open

    Donations over $300

    Robert Byrd gave $350.00

    Kim Kerns gave $750.00

    原理

    我们实现override SaveChanges() 方法,为我们的StateChange事件提供切入点,该事件处理程序接收两个参数:事件的发送者(sender)和StateChangeEventArgs.第二个参数提供了访问连接的当前状态和原始状态, 我们为这两个与数据库相关的状态做日志记录.如果你特点注意日志内容的顺序,你会注意到在第二个using块里,与数据库的连接在foreach执行要查询时重新启动,而不是在写查询语句时. 这个演示说明了一个重要的概念:查询只在必要时才进行.在我们的例子中,查询在遍历期间才执行

     

    附:创建示例用到的数据库的脚本文件

     

  • 相关阅读:
    企业库应用实践系列五:创建模板引擎Library
    关于HtmlHelper:是MVC自作聪明,还是我不够明白?
    企业库应用实践系列二:对象创建原理详解
    企业库应用实践系列三:自定义构造函数
    专业导论 计算机科学概论
    企业短期项目,缺人手
    光脚丫学LINQ(040):引发未将对象引用设置到对象的实例的异常
    光脚丫学LINQ(045):如何表示计算所得列(LINQ to SQL)
    光脚丫学LINQ(042):如何将列表示为由数据库生成的列
    光脚丫学LINQ(043):为实体类的列成员指定在数据库中的数据类型
  • 原文地址:https://www.cnblogs.com/kid1412/p/5160006.html
Copyright © 2011-2022 走看看