2017-06-21 4 views
2

私は、リポジトリパターンを使用してEntity Frameworkを使用してデータにアクセスしています。私はタマネギのアーキテクチャを使用して(と思う)すべてを正しく実装していますが、私はテストを実行するとき、私はエラーを取得する:タイプ 'System.Int64'に対してインスタンスプロパティが定義されていません

Instance Property 'IDDocument' is not defined for type 'System.Int64' 

(約フランス語から翻訳)

を私はテスト方法は以下の通りである。

public T Get(long id) 
{ 
    ObjectContext objContext = ((IObjectContextAdapter)context).ObjectContext; 
    ObjectSet<T> set = objContext.CreateObjectSet<T>(); 
    IEnumerable<string> keyNames = set.EntitySet.ElementType 
               .KeyMembers 
               .Select(k => k.Name); 
    if (keyNames.Count() > 1) 
     return null;//Que faire quand il y a plusieurs clés? 
    else 
    { 
     string idName = keyNames.ElementAt(0); // For Document would be IDDocument 
     var parameter = Expression.Parameter(id.GetType()); 
     var property = Expression.Property(parameter, idName); 
     var idValue = Expression.Constant(id, id.GetType()); 
     var equal = Expression.Equal(property, idValue); 
     var predicate = Expression.Lambda<Func<T, bool>>(equal, parameter); 
     return entities.SingleOrDefault(predicate); 
    } 
} 

私のテーブルは、私が説明できないだろう理由のために別のID名を持っていますが、私は私の結果を取得するためのパラメータを追加して、述語を使用する式ビルダーを使用する理由です。あなたはこの記事では、この方法を見ることができます:Does a Generic Repository need a Base Entity class to be applied everywhere?

IDDocumentが私のEFのエンティティのPOCOで次のように宣言されている:私は私のテストでそれを呼び出すとき

[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public long IDDocument { get; set; } 

そして:

[TestMethod] 
public void IdExistsGetTest() 
{ 
    long valueToCheck = 1L; 
    repo = new Repository<Web_Documents>(context); 
    var test = repo.Get(valueToCheck); 
    test.Should().BeOfType(typeof(Web_Documents)); 
} 

contextは私のdbcontext(前にインスタンス化)を定義します。

今、私はテストを実行すると、私は常に上に述べたArgumentException、私は何かが紛失している考えを得る?私は、Expressionなしでコードを変更すると、問題なく動作するので、問題はGet(long id)メソッドにあると思います。おかげ

答えて

5

私は思う:

var parameter = Expression.Parameter(id.GetType()); 

は次のようになります。

var parameter = Expression.Parameter(typeof(T)); 
+0

右側に、ありがとう!私は 'entities.singleOrDefault(predicate)'の型をチェックするときに 'Web_Document_8AEAF73BFA0B4906B5153F0BE5CFE91F2DC7F47643CDC9E48189AC7C08E041D2.'のような' Web_Documents'を取得しません。なぜ私は理解できないのですか? SingleOrDefaultが正しく理解されていなければなりません。 –

+1

あなたが見ているのはEFプロキシタイプ(レイジーローディングとオブジェクトトラッキングを提供するあなたのタイプのラッパー)です。プロキシ型はあなたの型から継承しますので、必要に応じて型に明示的にキャストできます。 https://msdn.microsoft.com/en-us/library/jj592886(v=vs.113).aspxを参照してください。 – bambam

関連する問題