我使用存储库模式使用Entity Framework访问数据。我已经使用洋葱架构正确地实现了一切(我认为),但是当我运行测试时,我得到错误:
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 builder添加参数然后使用谓词来检索我的结果。您可以在此帖子中看到此方法:Does a Generic Repository need a Base Entity class to be applied everywhere?
IDDocument在我的EF实体中按以下方式声明&#39; 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
的情况下更改代码,它可以正常工作(但不是我希望它!)。感谢
答案 0 :(得分:5)
我想:
var parameter = Expression.Parameter(id.GetType());
应该是:
var parameter = Expression.Parameter(typeof(T));