实例属性未定义类型&System; System.Int64'

时间:2017-06-21 15:05:52

标签: c# sql-server entity-framework repository-pattern

我使用存储库模式使用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的情况下更改代码,它可以正常工作(但不是我希望它!)。感谢

1 个答案:

答案 0 :(得分:5)

我想:

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

应该是:

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