1

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();
}

このシナリオについてより良い提案がありますか?

4

1 に答える 1

0

同様のシナリオに遭遇しました。素晴らしい解決策を見つけることができなかったので、フィードバックをお待ちしております。ModelBase私たちの解決策は、すべてのモデルに「共通」の 2 つのフィールドを持つ抽象クラスを作成することでした。

public abstract class ModelBase<T>
{
    /// <summary>
    /// The id of the model object
    /// </summary>
    public virtual T Id { get; set; }

    /// <summary>
    /// The date the model object was created
    /// </summary>
    public virtual DateTime CreateDate { get; set; }
}

次に、すべてのモデルにそのクラスを継承させます。

public class Product : ModelBase<int>
{
    public override int Id
    {
        get { return ProductId; }
        set { ProductId = value; }
    }

    public int ProductId { get; set; }
    ...
}

このようにして、エンティティのキ​​ー フィールドを常に把握できます。1 つの注意:Idプロパティを無視するように EF データベース マッピングを設定する必要があります。

于 2012-05-23T21:58:56.490 に答える