2015年11月20日 星期五

[Entity Framework] 取得DAO對應的表格名稱

 #Entity Framework   #C Sharp


Entity Framework 如果要直接下一些Sql指令,必要條件當然是要知道 Table name
Table Name寫死在程式當然是最不好的方式; 可以利用以下代碼取得DAO對應的Table Name


使用 System.Data.Entity.DbContext extension


/// <summary>
/// DbContext/ObjectContext extensions
/// </summary>
public static class ContextExtensions
{
        /// <summary>
        /// Get the table name of Entity
        /// </summary>
        /// <typeparam name="T">Entity's type</typeparam>
        /// <param name="context">DbContext</param>
        /// <returns>Table name</returns>
        public static string GetTableName<T>(this DbContext context) where T : class
        {
            ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext;
            return objectContext.GetTableName<T>();
        }

        /// <summary>
        /// Get the table name of Entity
        /// </summary>
        /// <typeparam name="T">Entity's type</typeparam>
        /// <param name="context">ObjectContext</param>
        /// <returns>Table name</returns>
        public static string GetTableName<T>(this ObjectContext context) where T : class
        {
            string sql = context.CreateObjectSet<T>().ToTraceString();
            Regex regex = new Regex("FROM (?<table>.*) AS");
            Match match = regex.Match(sql);

            string table = match.Groups["table"].Value;
            return table;
        }
}

使用方式:

var targetTableName = this._dbContext.GetTableName<MyEntity>();



定義 [Table(“”)]

Entity Framework Code first中, 通常會定義 [Table("XXXX")] DAO (Entity) 類別上。

[Table("MyEntities")]
public class MyEntity : BaseEntity
{  …


這時候就可以使用 typeof(T).GetCustomAttributes 方法, 取得T類別定義的Class attributes
代碼如下:

var attr =
       typeof(T).GetCustomAttributes(false).Where(x => x.GetType().Name.Equals("TableAttribute")).FirstOrDefault();

if (attr != null)
{
    this._tableName = (attr as System.ComponentModel.DataAnnotations.Schema.TableAttribute).Name;
}
else
{
     throw new Exception("Cannot get the table name of POCO : AdOU");
}


沒有留言:

張貼留言