EntityFramework.dll中出现“System.ArgumentException”类型的异常,但未在用户代码中处理

时间:2015-01-26 10:57:42

标签: c# linq entity-framework lambda

我遇到的问题是:

  

类型' System.ArgumentException'的例外情况发生在EntityFramework.dll中但未在用户代码中处理

     

附加信息:Include路径表达式必须引用在类型上定义的导航属性。使用虚线路径作为参考导航属性,使用Select运算符作为集合导航属性。

我该如何解决?

此问题发生在FindAll方法

articleViewModel.AttachmentFiles = AttachmentFileBLL.Instance.FindAll(c => c.ArticleId == articleViewModel.Id).ToList();

FindAll方法:

public virtual IQueryable<TModel> FindAll(params Expression<Func<TModel, object>>[] includeProperties)
    {
        IQueryable<TModel> items = RepositoryContainer<TRepository>().FindAll();

        if (includeProperties != null)
        {
            foreach (var includeProperty in includeProperties)
            {
                items = items.Include(includeProperty); // Problem occurred here! 
            }
        }
        return items;
    }

Error location

public virtual int? ArticleId { get; set; }

public virtual int Id { get; set; }

1 个答案:

答案 0 :(得分:1)

您正在向DbExtensions.Include Method传递无效参数,因为它需要

  

表示要包含的路径的lambda表达式。

而不是像你指定的条件:

c => c.ArticleId == articleViewModel.Id

您需要以不同方式致电FindAll

AttachmentFileBLL
    .Instance
    .FindAll(c => c.ArticleId)
    .ToList();

这将指定属性。

但是,由于您还需要为此指定导航属性,因此您需要在此处使用此类属性。我不知道它在你的模型中可以有什么名称,但也许这样:

AttachmentFileBLL
    .Instance
    .FindAll(c => c.Articles) // Assuming 'Articles' is a navigation property.
    .ToList();

如果你只想获得一些物品,你应该把条件放在一些Where中,以满足你的需要:

AttachmentFileBLL
   .Instance
   .SomeCollection
   .Where(c => c.ArticleId == articleViewModel.Id)
   .FindAll(c => c.Articles)
   .ToList();