【问题标题】:How do I include a [NotMapped] property in an EF business object without getting FirstChance IndexOutofRangeException?如何在不获取 FirstChance IndexOutofRangeException 的情况下在 EF 业务对象中包含 [NotMapped] 属性?
【发布时间】:2021-01-16 18:55:37
【问题描述】:

我想知道为什么我的 XAF WinForms EF 应用程序加载详细视图的速度很慢。 然后我学习了如何捕获 FirstChance 异常,并发现我遇到了 IndexOutOfRange 异常,如here所述。

有时我想在我的业务对象中包含一个非映射属性,例如示例中的 Job。

  public class OrderLineResult  
    {
        public int LineId { get; set; }
        public int Quantity { get; set; }
        public string Description { get; set; }
        [Browsable(false)] public int JobId { get; set; }
        [NotMapped] [Browsable(false)] public virtual Job Job { get; set; } 
    }

我有一个方法可以在 OrderLineResult 类中获取数据

public static OrderLineResult[] GetData(int headId)
    {
        using var connect = new MyDbContext()
            const string sql =
            @"SET NOCOUNT ON;
            create table #temp( JobId int, Quantity int,  LineId int, Description   )
            /* code to populate the table */
            select JobId,LineId,Quantity, Description  from #temp"
            var results = connect.Database.SqlQuery<OrderLineResult>(sql,headId).ToArray();
            return results.ToArray();
        }
    }

但 Job 属性发生 IndexOutOfRange 异常。

调用栈是

System.IndexOutOfRangeException
Job
   at MyApp.Module.Win.Controllers.ToDoList.TaskActionController.<>c.<actExceptions_Execute>b__34_0(Object sender, FirstChanceExceptionEventArgs e)
   at System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName)
   at System.Data.SqlClient.SqlDataReader.GetOrdinal(String name)
   at System.Data.Entity.Core.Query.InternalTrees.ColumnMapFactory.TryGetColumnOrdinalFromReader(DbDataReader storeDataReader, String columnName, Int32& ordinal)
   at System.Data.Entity.Core.Query.InternalTrees.ColumnMapFactory.CreateColumnMapFromReaderAndClrType(DbDataReader reader, Type type, MetadataWorkspace workspace)
   at System.Data.Entity.Core.Objects.ObjectContext.InternalTranslate[TElement](DbDataReader reader, String entitySetName, MergeOption mergeOption, Boolean streaming, EntitySet& entitySet, TypeUsage& edmType)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryInternal[TElement](String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] parameters)
   at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass186_0`1.<ExecuteStoreQueryReliably>b__1()
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
   at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass186_0`1.<ExecuteStoreQueryReliably>b__0()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryReliably[TElement](String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] parameters)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQuery[TElement](String commandText, ExecutionOptions executionOptions, Object[] parameters)
   at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at MyApp.Module.BusinessObjects.NonPersistedBusinessObjects.OrderLineResult.GetData(Int32 headId)

我正在使用 EntityFramework 6.4.4 和 .Net Framework 4.7.2

【问题讨论】:

  • 您显示的异常来自 EF6,而不是 EF Core。
  • 真的吗?是什么让你这么说? Nuget 包管理器显示我正在使用 Microsoft.EntityFrameworkCore v3.1.9
  • System.Data.Entity.* 命名空间由 EF6 使用。 EF Core 命名空间以Microsoft.EntityFrameworkCore 开头。还有SqlQuery 方法(EF Core 中不存在这种方法)。等等。

标签: entity-framework-6 xaf


【解决方案1】:

这感觉就像是一团糟, 我加了

 ,null as job

到最后一个选择语句

【讨论】:

  • 对计算字段执行相同操作
  • 或者把字段改成方法。
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多