我想为Entity框架实现几个扩展。 让我们以此为例。
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
的{{1}}或以EntityTypeConfiguration<T>
实现的形式定义,并以相同的方法传递到模型构建器配置中。
如何从DbContext实例中检索表和字段的名称? 它有可能吗?
答案 0 :(得分: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中的列的显示顺序与匿名类型
中的相同