2013-02-16 70 views
1

我想爲實體框架實現多個擴展。 讓我們以此爲例。從實體框架中提取模型信息4.3 - 5

void InsertOrUpdate<T, TUpdateFields, TInsertFields, TKey>(
    this DbContext context, 
    IEnumerable<T> data, 
    Expression<Func<T, TUpdateFields>> updateFields, 
    Expression<Func<T, TInsertFields>> insertFields, 
    Expression<Func<T, TKey>> key) 

它應該像這樣使用。

var dc = new SomeContext(); 
var user = new User() { /* initialize */ }; 
var array = new[] { user }; 
dc.InsertOrUpdate(
    array, 
    x => new { 
     x.UserName, 
     x.Password, 
     x.LastLoggedIn 
    }, 
    x => new { 
     x.UserName, 
     x.Password, 
     x.Email, 
     x.DateAdded, 
     x.LastLoggedIn 
    }, 
    x => x.UserName); 

的方法,將產生SQL字符串並把它傳遞到DbContext.Database.ExecuteSqlCommand方法。 但爲了生成sql,我需要從模型信息中提取表和字段名稱,以防它們與類和屬性名稱不同。

(例如UserName屬性對應於DB user_name字段)

我知道他們可以在實體本身作爲數據註解,直接在OnModelCreating(DbModelBuilder)方法的DbContext 在模型構建器定義的或在形式上定義被設置的EntityTypeConfiguration<T>實現,並以相同的方法傳遞到模型構建器配置中。

如何從DbContext實例中檢索表和字段的名稱? 有沒有可能?

回答

0

我似乎很容易。如果下面是類定義

[Table("User")] 
public class User { 
    [Column("user_id")] 
    public Int32 UserId {get;set;} 
    [Column("user_name")] 
    public String UserName {get;set;} 
    [Column("email")] 
    public String Email {get;set;} 
    [Column("join_date")] 
    public DateTime DateAdded {get;set;} 
    [Column("password")] 
    public String Password {get;set;} 
    [Column("last_logged_in")] 
    public DateTime LastLoggedIn {get;set;} 
} 

我可以只使用以下方法

void InsertOrUpdate<T, TUpdateFields, TInsertFields, TKey>(
    this DbContext context, 
    IEnumerable<T> data, 
    Expression<Func<T, TUpdateFields>> updateFields, 
    Expression<Func<T, TInsertFields>> insertFields, 
    Expression<Func<T, TKey>> key){ 

    var sql = context.Set<T>().Select(updateFields).ToString(); 
    // Do stuff 
} 

最終SQL變量將包含這樣的事情

SELECT 
1 AS [C1], 
[Extent1].[user_name] AS [user_name], 
[Extent1].[password] AS [password], 
[Extent1].[last_logged_in] AS [last_logged_in] 
FROM [dbo].[tbUser] AS [Extent1] 

這種說法可以被解析到找出表格和欄目名稱。生成的sql中的列以與匿名類型中指示的順序相同的順序出現