2013-02-16 3 views
1

Я хочу реализовать несколько расширений для платформы Entity. Давайте встретим это в качестве примера.Извлечь информацию о модели из Entity Framework 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 свойство соответствует user_name поля в БД)

Я знаю, что они могут быть установлены в самой как аннотации данных, определенных в ModelBuilder непосредственно в 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 отображаются в том же порядке, в каком они указаны анонимным типом