Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对具有DateTime属性的实体使用IncludeFilter时出现InvalidCastException;_C#_Entity Framework_Entity Framework Core_Entity Framework Plus - Fatal编程技术网

C# 对具有DateTime属性的实体使用IncludeFilter时出现InvalidCastException;

C# 对具有DateTime属性的实体使用IncludeFilter时出现InvalidCastException;,c#,entity-framework,entity-framework-core,entity-framework-plus,C#,Entity Framework,Entity Framework Core,Entity Framework Plus,我遇到了一个我不理解的InvalidCastException,它与Entity Framework Plus库及其IncludeFilter扩展方法有关 总之,我有3个实体:项目、测试和测试运行: -每个项目都有一组测试; -每个测试都有一组测试运行。 我有一个ProjectService类,它实现了一个从数据库检索项目的方法,并提供了一些选项来选择所需的包含项。下面是该方法的代码(我将其拆分为仍然生成相同异常的最小代码段,再加上另一段用于比较的代码): 我实际得到InvalidCastExc

我遇到了一个我不理解的InvalidCastException,它与Entity Framework Plus库及其IncludeFilter扩展方法有关

总之,我有3个实体:项目、测试和测试运行: -每个项目都有一组测试; -每个测试都有一组测试运行。 我有一个ProjectService类,它实现了一个从数据库检索项目的方法,并提供了一些选项来选择所需的包含项。下面是该方法的代码(我将其拆分为仍然生成相同异常的最小代码段,再加上另一段用于比较的代码):

我实际得到InvalidCastException的地方(来自SingleOrDefault调用):

完整的异常消息是:

System.InvalidCastException:'无法将类型为'System.String'的对象强制转换为类型为'System.Int32'

以及发生错误时的堆栈跟踪:

在System.Data.SqlClient.SqlBuffer.get_Int32()处 位于System.Data.SqlClient.SqlDataReader.GetInt32(Int32 i) at lambda_方法(闭包、DbDataReader) 位于Microsoft.EntityFrameworkCore.Storage.Internal.TypedRelationalValueBufferFactory.Create(DbDataReader dataReader) 在Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable
1.Enumerator.BufferlessMovenText(DbContext),布尔缓冲区)
在Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState,Func
3操作,Func
3验证成功)
位于Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable
1.Enumerator.MoveNext() 在System.Linq.Lookup
2.CreateForJoin(IEnumerable
1源、Func
2键选择器、IEqualityComparer
1比较器) 在System.Linq.Enumerable.JoineIterator[TOuter,TInner,TKey,TResult](IEnumerable
1外部,IEnumerable
1内部,Func
2外部查询选择器,Func
2内部查询选择器,Func
3结果选择器,IEqualityComparer
1比较器)+MoveNext() 在System.Linq.Enumerable.GroupJoinIterator[TOuter,TInner,TKey,TResult](IEnumerable
1外部,IEnumerable
1内部,Func
2外部标记选择器,Func
2内部标记选择器,Func
3结果选择器,IEqualityComparer
1比较器)+MoveNext() 在System.Linq.Enumerable.SelectManyInterator[TSource,TCollection,TResult](IEnumerable
1 source,Func
2 collectionSelector,Func
3 resultSelector)+MoveNext()
在System.Linq.Enumerable.SelectEnumerableInterator中
2.MoveNext() 在Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.\u TrackEntities[TOut,TIn](IEnumerable
1结果,QueryContext QueryContext,IList
1 EntityTrackingFos,IList
1 entityAccessors)+MoveNext()
位于Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor
1.EnumeratorExceptionInterceptor.MoveNext() 在Z.EntityFramework.Plus.QueryFutureEnumerable
1.SetResult处(IEnumerator
1枚举器) 在Z.EntityFramework.Plus.QueryFutureEnumerable
1.SetResult(DbDataReader)处
在Z.EntityFramework.Plus.QueryFutureBatch.ExecuteQueries()中
在Z.EntityFramework.Plus.QueryFutureValue上
1.get_Value() 在Z.EntityFramework.Plus.QueryCludeFilterProvider
1.Execute[TResult](表达式)
位于System.Linq.Queryable.SingleOrDefault[TSource](IQueryable
1源,表达式`1谓词) 在Tresse.Service.Impl.ProjectService.Get(Int32 projectId,ProjectIncludeOptions包括)

最让我困惑的是,当我使用ProjectIncludeOptions.DOMAINS部分时,我没有得到任何异常,这显然是以完全相同的方式实现的(IsArchived属性在TestDomain对象上也是相同的)

更重要的是,我的所有实体(项目、测试、测试运行和测试域)都有DateTime属性,它们似乎在这个问题中起了作用。实际上,如果我将Test和TestRun中的所有DateTime属性标记为
[NotMapped]
(同时将所有代码保留在ProjectService中,如上所示),那么异常就会消失!如果只映射了一个DateTime属性(无论是哪一个),则会触发异常。 然而,它们似乎不会对TestDomain和上面的代码造成任何问题

这对你们有什么意义吗


通过完全删除IncludeFilter中的WHERE子句,我成功地解决了这种情况(因为它对我的项目来说并不重要),但我很高兴至少能了解正在发生的事情并找到解决方案

我不确定这是否就是问题所在,但
IncludeFilter
的目标是生成查询并在数据库端进行过滤

但是,
IsArchived
属性未映射。这意味着,不可能创建一个将在数据库端执行的查询(由于客户端评估,可能在EF Core 2.x中也可以)

确保过滤部分可以全部在数据库中完成


直接使用
ArchivingDate
属性似乎是可行的。

是的,我在发布问题后意识到我可以使用ArchivingDate。我试过了,很酷。我仍然不明白为什么其他使用相同IncludeFilter的查询会起作用,但我想这是不应该的,我发现了一些积极的漏洞。在任何情况下,是否有方法将未映射属性与IncludeFilter一起使用?可能是通过事先解释它们?是的,通过使用与数据库映射的属性解释它们。未映射的属性不能用于生成查询,因此我们在这里无法真正执行任何操作;(
private IQueryable<Project> NewQuery(ProjectIncludeOptions includes = ProjectIncludeOptions.NONE)
{
    IQueryable<Project> query = base.NewQuery();

    /* NO PROBLEM HERE: just left it for comparison. */
    if (includes.HasFlag(ProjectIncludeOptions.DOMAINS))
    {
        query =
            query
                .IncludeFilter(p => p.TestDomains.Where(td => !td.IsArchived).Select(td => td.Children.Where(tdc => !tdc.IsArchived)))
                .IncludeFilter(p => p.TestDomains.Where(td => !td.IsArchived).Select(td => td.Parent));
    }

    /* EXCEPTION CAUSED BY THE CODE BELOW */
    if (includes.HasFlag(ProjectIncludeOptions.TESTS))
    {
        query =
            query
                /* In the below code, if I remove the Where clause, or use a non-calculated property in it, then the exception disappears. */
                .IncludeFilter(p => p.Tests.Where(t => !t.IsArchived).Select(t => t.TestRuns));
    }

    return query;
}
[NotMapped]
public virtual bool IsArchived
{
    get { return ArchivingDate.HasValue; }
    set { ArchivingDate = value ? System.DateTime.Now : (System.DateTime?)null; }
}
Project project = NewQuery(includes).SingleOrDefault(p => p.Id == projectId);