1

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プロパティuser_nameはDBのフィールドに対応します)

データ注釈としてエンティティ自体に設定し、モデルビルダーで直接OnModelCreating(DbModelBuilder)メソッドで定義するか、実装DbContextの形式で定義し、同じメソッドでモデルビルダー構成に渡すことができることを私は知っています。EntityTypeConfiguration<T>

DbContext インスタンスからテーブルとフィールドの名前を取得するにはどうすればよいですか? それはまったく可能ですか?

4

1 に答える 1

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 の列は、匿名型で示されているのと同じ順序で表示されます

于 2013-03-14T12:44:36.727 に答える