gpt4 book ai didi

c# - 使用 Interface for DbContext 会导致子查询出现问题

转载 作者:太空宇宙 更新时间:2023-11-03 13:22:39 25 4
gpt4 key购买 nike

我正在为 DbContext 使用一个接口(interface),这样我就可以为我的服务层编写单元测试,而无需依赖于具体的 DbContext。当 LINQ 语句中有子查询时,这似乎效果不佳。

这是我用来测试 EF5 的简单测试。

我为我的数据库上下文声明了一个接口(interface)

public interface IDbContext
{
#region DbContext public properties
DbChangeTracker ChangeTracker { get; }
DbContextConfiguration Configuration { get; }
Database Database { get; }
#endregion

#region DbContext public methods
IEnumerable<DbEntityValidationResult> GetValidationErrors();
DbEntityEntry Entry(object entity);
DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;
DbSet<TEntity> Set<TEntity>() where TEntity : class;
DbSet Set(Type entityType);
int SaveChanges();
#endregion
}

public interface ISchoolContext : IDbContext,IDisposable
{
DbSet<Course> Courses { get; set; }
DbSet<Department> Departments { get; set; }
}

然后我的SchoolEntities实现了上面的接口(interface)

public partial class SchoolEntities : DbContext, ISchoolContext

以下代码抛出错误“System.NotSupportedException:无法创建类型为‘TestEF.Course’的常量值。在此上下文中仅支持原始类型或枚举类型”。

*ISchoolContext* ctx = new SchoolEntities()
var query = from dep in ctx.Departments where dep.Budget > 0 && !ctx.Courses.Any(c => c.DepartmentID == dep.DepartmentID) select dep.DepartmentID;

如果我用 SchoolEntities 替换 ISchoolContext 声明,上面的代码工作正常。

SchoolEntities ctx = new SchoolEntities()

注意:该代码也适用于 EF6 中的界面。这是否意味着这是 EF5 中的错误?如果这是一个错误,是否有任何破解方法?

感谢阅读一篇很长的文章。

最佳答案

您遇到了一个非常奇怪的行为。你能用你的例子试试这个查询吗?它应该与您的相等,但使用左连接。

var query = from dep in ctx.Departments
join course in ctx.Courses
on dep.DepartmentID equals course.DepartmentID into leftJoin
from courseLeftJoin in leftJoin.DefaultIfEmpty()
where dep.Budget > 0 && courseLeftJoin == null
select dep.DepartmentID;

让我知道它是否适用于界面。

编辑:

很高兴听到这个查询有效。我无法使用 EF5 重现该问题。您可以重新安装 EF5 5.0.0 吗?

为此,请打开包管理器控制台(在菜单工具 > NuGet 包管理器中可用)以运行此命令:

PM> Install-Package EntityFramework -Version 5.0.0

上面这行可以在 official website 上找到的 NuGet。

编辑 2:

测试您的代码后,我能够重现该问题。我看到异常是在 System.Data.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter parent, ConstantExpression linq) 处抛出的。使用反编译器,我能够找到抛出 NotSupportedException 的行。

然后,我将此功能与 EF5 和 EF6 进行了比较。这是结果: .

我无法说明为什么会出现此错误,但不幸的是,我怀疑 EF5 的实现无法处理您的情况。

我使用代码优先方法尝试了您的代码并成功了。此问题必须与设计器方法 (EDMX) 有关。

关于c# - 使用 Interface for DbContext 会导致子查询出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23617156/

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