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