2017-06-21 50 views
2

我正在使用實體框架來使用存儲庫模式來訪問數據。我一直在使用一個洋蔥架構正確(我認爲)來實現的一切,但是當我運行測試中,我得到的錯誤:實例屬性沒有爲'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名稱,原因我不會解釋,但這就是爲什麼我使用Expression構建器來添加參數,然後使用謂詞來檢索我的結果。您可以在這個帖子看到這種方法: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,任何想法我缺少什麼?我認爲問題存在於Get(long id)方法中,因爲如果我在沒有Expression的情況下更改代碼,它可以正常工作(但不會像我想要的那樣!)。由於

回答

5

我想:

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

應該是:

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

對上,謝謝!當我檢查'entities.SingleOrDefault(謂詞)'的類型時,我確實有另一個問題''我沒有'Web_Documents',但是'Web_Document_8AEAF73BFA0B4906B5153F0BE5CFE91F2DC7F47643CDC9E48189AC7C08E041D2.'。我不明白爲什麼?必須正確理解SingleOrDefault。 –

+1

您所看到的是EF代理類型(您的類型提供了延遲加載和對象跟蹤的封裝)。代理類型繼承自您的類型,因此您可以根據需要明確地將其轉換爲您的類型。請參閱https://msdn.microsoft.com/en-us/library/jj592886(v=vs.113).aspx – bambam

相關問題