c# 实体框架中发生了类型 'System.ArgumentException' 的异常.dll但未在用户代码中处理



我遇到了该描述的问题:

EntityFramework 中发生了类型为"System.ArgumentException"的异常.dll但未在用户代码中处理。

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

调用Getall方法时出现问题

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

获取全部方法:

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; }
}

知道为什么会这样吗?

不能在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();               
    }
}

如果你只需要加载带有LanguageName=="ENG" GroupLanguage,那么你应该投影你的查询,但你会失去你的实体类型,因为Linq到实体只支持对匿名对象或DTO的项目查询,例如:

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();               
    }
}

相关内容

最新更新