【问题标题】:c# An exception of type 'System.ArgumentException' occurred in EntityFramework.dll but was not handled in user codec#在EntityFramework.dll中发生'System.ArgumentException'类型的异常,但未在用户代码中处理
【发布时间】:2017-03-21 15:21:21
【问题描述】:

我遇到了该描述的问题:

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

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

当我调用我的 Getall 方法时出现问题

var gruppi = GroupHelper.GetAll().OrderBy(a => a.Order);

GetAll 方法:

public new static ICollection<Group> GetAll()
    {
        using (var provider = new GroupProvider())
        {
          provider.QAll().Include
          (a => a.RoleGroup.Select(c => c.Role)).
          Include(a=>a.GroupLanguage.Select(b=>b.Language).
          Where(c=>c.LanguageName=="ENG")).ToList();               
        }
    }

GroupLanguageRoleGroup 的属性如下:

public class GroupLanguage
{
    [Key, Column(Order = 1)]
    public Guid LanguageID { get; set; }
    [Key, Column(Order = 2)]
    public int GroupID { get; set; }
    [ForeignKey("LanguageID")]
    public Language Language { get; set; }
    [ForeignKey("GroupID")]
    public Group Group { get; set; }
}

public class RoleGroup
{
    [Key, Column(Order = 1)]
    public Guid RoleId { get; set; }
    [Key, Column(Order = 2)]
    public int GroupId { get; set; }
    [ForeignKey("RoleId")]
    public Role Role { get; set; }
    [ForeignKey("GroupId")]
    public Group Group { get; set; }
}

知道为什么会这样吗?

【问题讨论】:

  • 添加 try-catch 块可能会帮助您找出解决此问题的步骤。到目前为止,您尝试过什么?
  • @confusedandamused 我试图拆分查询但没有成功,我得到了同样的异常

标签: c# entity-framework


【解决方案1】:

您无法过滤Include,您需要引用导航属性。去掉里面的Where调用:

public new static ICollection<Group> GetAll()
{
    using (var provider = new GroupProvider())
    {
      provider.QAll().Include(a => a.RoleGroup.Select(c => c.Role))
                     .Include(a=>a.GroupLanguage.Select(b=>b.Language)).ToList();               
    }
}

如果您只需要加载 GroupLanguageLanguageName=="ENG",那么您应该投影您的查询​​,但是您将失去您的实体类型,因为 Linq to entity 仅支持将查询投影到匿名对象或 @987654321 @,例如:

public new static ICollection<GroupDTO> GetAll()
{
    using (var provider = new GroupProvider())
    {
      provider.QAll().Include(a => a.RoleGroup.Select(c => c.Role))
                     .Include(a=>a.GroupLanguage.Select(b=>b.Language))
                     .Select(a=>new GroupDTO{GroupName=a.Name, 
                                             Language=a.GroupLanguage.Select(b=>b.Language)
                                                                     .Where(c=>c.LanguageName=="ENG")})
                     .ToList();               
    }
}

【讨论】:

  • 嗯好的,我会试试的...但是 GroupDTO 应该是什么?我对实体框架有点陌生
  • 对不起,我应该解释一下,它是一个自定义类,您使用您只需要的属性定义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多