【问题标题】:Extract model information from Entity Framework 4.3 - 5从 Entity Framework 4.3 - 5 中提取模型信息
【发布时间】:2013-02-16 19:57:28
【问题描述】:

我想为实体框架实现几个扩展。 让我们以这个为例。

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)方法中定义在modelbuilder中 DbContext 或以EntityTypeConfiguration&lt;T&gt; 实现的形式定义,并以相同的方法传递到模型构建器配置中。

如何从 DbContext 实例中检索表和字段的名称? 有可能吗?

【问题讨论】:

    标签: .net entity-framework-5 entity-framework-4.3


    【解决方案1】:

    我似乎真的很容易。如果下面是类定义

    [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 中的列的出现顺序与它们在匿名类型中指示的顺序相同

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多