首页 > 解决方案 > 在日志记录中获取 TEntity 类型

问题描述

我在 C# 中使用 Entity Framework 6 并实现了我自己的类,DatabaseLogFormatter以便能够格式化来自日志的内容。

我想在日志中添加更多详细信息,即执行 SQL 的 TEntity 对象类型(使用这些过程DbSqlQuery<TEntity> SqlQuery(string sql, params object[] parameters))。因此,如果我有一个实体命名staff并调用staff.SqlQuery我可以在LogCommand()拉出它是staff调用 SQL。然后我可以在我的日志中加入一行Entity "staff" executed the command...

标签: c#.netentity-frameworkentity-framework-6

解决方案


为您到目前为止所拥有的内容提供一些代码。鉴于它不是扩展方法,因此从示例过程中不清楚。猜测一下,如果您想要一个针对DbSet<TEntity>...运行的扩展方法

public static class DbSetExtensions
{
   public static DbSqlQuery<TEntity> SqlQuery<TEntity>(this DbSet<TEntity> dbSet, string sql, params object[] parameters) where TEntity : class
   {
      // Do stuff with dbSet...
      Logger.Instance.Write(string.Replace("Entity \"{0}\" executed the command...", typeof(TEntity).Name));
   }
}

调用代码将类似于:

using( var context = new myDbContext())
{
   var query = context.Orders.SqlQuery(sql);
   // ...
   var results = query.ToList();
}

作为静态方法,要访问记录器,您需要将其解析为静态类或静态单例。或者,仅提取 DbSet 的名称以用于非静态存储库方法等:

public static class DbSetExtensions
{
   public static string EntityName<TEntity>(this DbSet<TEntity> dbSet) where TEntity : class
   {
      return typeof(TEntity).Name;
   }
}

尽管没有代码,但很难猜测您打算如何使用 SqlQuery 方法...


推荐阅读