POCOクラスをデータベーステーブルにマッピングするためにEFfluentAPIを使用しました。自分のアプリケーションロジックでマッピング構成を使用する必要があります。具体的には、エンティティ「Product」があり、このエンティティに対して次のマッピングがあるとします。
public class ProductMap : EntityTypeConfiguration<Product>
{
public ProductMap()
{
....
this.HasKey(t => t.ProductId);
...
}
}
私のアプリケーションロジックでは、エンティティのキーフィールド(ここではProductId)を取得するジェネリックメソッドを記述したいと思います。データ注釈属性を使用した場合、リフレクションを使用してキープロパティを見つけることができます。私の質問は、流暢なAPIを使用してマッピングを定義するときに、基本的に同じことを達成できるかどうかです。
ありがとうdiaho。私はあなたが提案する解決策に正確に到達しましたが、エンティティフレームワークでは純粋なエンティティフィールドではないフィールドを使用してクエリを実行できないため、それでも良い解決策ではありません。次の例を見てください。IDに基づいてエンティティを返すジェネリックメソッドを記述したいと思います。私は次の解決策に到達しました:
public TModel GetById<TModel, TKey>(TKey id) where TModel : ModelBase<TKey>
{
return _context.Set<TModel>().where(e => e.Id == id).FirstOrDefault();
}
ただし、エンティティフレームワークe.Id
は、駆動されるエンティティクラスのフィールド(親クラスのフィールド)ではないと文句を言うため、このコードは機能しません。もちろん、Set<TModel>()
リストに変換して(次のように)クエリを強制的に実行することで、この問題をハックすることは可能です。ただし、これは、すべてのエンティティをメモリにロードして1つのエンティティを取得するため、パフォーマンスの点でひどいものです。
public TModel GetById<TModel, TKey>(TKey id) where TModel : ModelBase<TKey>
{
return _context.Set<TModel>().ToList().where(e => e.Id == id).FirstOrDefault();
}
このシナリオについてより良い提案がありますか?