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
的情況下更改代碼,它可以正常工作(但不會像我想要的那樣!)。由於
對上,謝謝!當我檢查'entities.SingleOrDefault(謂詞)'的類型時,我確實有另一個問題''我沒有'Web_Documents',但是'Web_Document_8AEAF73BFA0B4906B5153F0BE5CFE91F2DC7F47643CDC9E48189AC7C08E041D2.'。我不明白爲什麼?必須正確理解SingleOrDefault。 –
您所看到的是EF代理類型(您的類型提供了延遲加載和對象跟蹤的封裝)。代理類型繼承自您的類型,因此您可以根據需要明確地將其轉換爲您的類型。請參閱https://msdn.microsoft.com/en-us/library/jj592886(v=vs.113).aspx – bambam