gpt4 book ai didi

c# - 通过接口(interface)访问时,DbContext 在查询时抛出异常

转载 作者:太空狗 更新时间:2023-10-29 21:41:01 25 4
gpt4 key购买 nike

我已经创建了我的 DbContext 类实现的接口(interface),这使我能够为单元测试创​​建一个假的数据库上下文。到目前为止,这适用于我所有的 LINQ 查询,但有一个查询出现以下异常:

Unable to create a constant value of type 'DemoApp.Member'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.

通过接口(interface)执行 LINQ 查询会抛出上述异常,但是当直接在我的 DBContext 上执行完全相同的查询时,查询 100% 有效。这是接口(interface)和相关的演示代码定义:

    interface IDemoContext : IDisposable
{
IDbSet<Member> Members { get; set; }
IDbSet<Team> Teams { get; set; }
}

public partial class DemoContext : DbContext, IDemoContext
{
public DemoContext() : base("name=DemoContext"){}

public IDbSet<Member> Members { get; set; }
public IDbSet<Team> Teams { get; set; }
}

public partial class Member
{
public Member()
{
this.SecondaryTeams = new HashSet<Team>();
}

public int ID { get; set; }
public string Name { get; set; }
public int? PrimaryTeamID { get; set; }

public virtual Team PrimaryTeam { get; set; }
public virtual ICollection<Team> SecondaryTeams { get; set; }
}

public partial class Team
{
public Team()
{
this.PrimaryMembers = new HashSet<Member>();
this.SecondaryMembers = new HashSet<Member>();
}

public int ID { get; set; }
public string Name { get; set; }

public virtual ICollection<Member> PrimaryMembers { get; set; }
public virtual ICollection<Member> SecondaryMembers { get; set; }
}

每个成员都可能属于一个主要团队,也可能属于多个次要团队。以下演示代码抛出异常:

using (IDemoContext dbi = new DemoContext())
{
var members =
(from member in dbi.Members
select new
{
Name = member.Name,
Team = member.PrimaryTeam.Name,
SecondaryTeams = from secondaryTeam in member.SecondaryTeams
join primaryMember in dbi.Members
on secondaryTeam.ID equals primaryMember.PrimaryTeamID
into secondaryTeamMembers
select new
{
Name = secondaryTeam.Name,
Count = secondaryTeamMembers.Count()
}
}).ToList();
}

如果我将第一行更改为:

using (DemoContext dbi = new DemoContext())

然后查询完美执行。

所以我的问题是:

  1. 为什么它通过 DemoContext 而不是 IDemoContext 工作?
  2. 如何更改 IDemoContext 以便此查询通过界面工作?

最佳答案

尝试用查询中的局部变量替换 dbi.Members

    using (IDemoContext dbi = new DemoContext())
{
IQueryable<Member> memberSet = dbi.Members;

var members =
(from member in memberSet
select new
{
Name = member.Name,
Team = member.PrimaryTeam.Name,
SecondaryTeams = from secondaryTeam in member.SecondaryTeams
join primaryMember in memberSet
on secondaryTeam.ID equals primaryMember.PrimaryTeamID
into secondaryTeamMembers
select new
{
Name = secondaryTeam.Name,
Count = secondaryTeamMembers.Count()
}
}).ToList();
}

关于c# - 通过接口(interface)访问时,DbContext 在查询时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8935094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com