私は次のような問題を持っている:私はのIntまたはGUIDエンティティのキーのために設計されDbContextを使用して、一般的なEFリポジトリを持っているので、私は基本エンティティクラスを持っている:EFのオブジェクト比較
public class EntityBase<TKey> where TKey : struct, IComparable
{
public virtual TKey Id { get; set; }
}
- 処理鍵ます派生クラスでIntまたはGuidとして提供されます。
私はエンティティタイプの処理鍵であり、intとして派生クラスで設定されているコード
public virtual void LoadEntity()
{
TEntity entity = Repository.Get<TEntity, TKey>(e => object.Equals(e.Id, EntityId));
}
または
public virtual void LoadEntity()
{
TEntity entity = Repository.Get<TEntity, TKey>(e => e.Id.CompareTo(EntityId) == 0);
}
を実行すると、例えば、私は次のエラーを取得します:
'のSystem.Object' をタイプするタイプ '可能System.Int32' をキャストすることができません。 LINQ to Entitiesは、エンティティデータモデルのプリミティブタイプをキャストするだけをサポートします。
Repository.Get DbSetリポジトリのWhere呼び出しのフィルタとして述語パラメータを渡します。
私はエラーを理解しています - EFはSQL文に変換しようとしますが、オブジェクト比較の処理方法はわかりません。しかし、EFがプリミティブ型で動作できるように、基本クラスやLoadEntity()関数を書き直す方法はわかりません。 アイデア
こんにちはPawel、私はRepository.Get(e =>(オブジェクト)e.Id ==(オブジェクト)EntityId)を使用しました。それはオブジェクトにキャストされているので、好奇心です、しかし、SQLは正しく生成されます(SELECT .... WHERE Id = {EntityId})。ありがとうございました! –
Lixi
問題を解決したと聞いてうれしいです。あなたの質問への回答として回答を記入してください。ありがとう! – Pawel
Repository.Get(e =>(オブジェクト)e.Id ==(オブジェクト)EntityId)はデータベース上で動作しますが、メモリ内のコレクションでは機能しません。だから私はPawel(Filter (IQueryable dbSet、式>プロパティ、TProperty値)で提案された2番目のソリューションを試してみましたが、これは正しい解決策です –
Lixi