代码之家  ›  专栏  ›  技术社区  ›  Josh

实体框架异常:索引超出数组的边界。”

  •  3
  • Josh  · 技术社区  · 15 年前

    好的,我对实体框架有意见。我已经让它工作了,但是现在又向模型中添加了几个实体,现在我得到了上面的错误。出于调试的目的,我创建了一个带有网格控件的测试表单,以便从我的项目实体集合中填充。仅供参考,我的主键是guid。我只有一点代码:

    Public Class TestForm
    Private Sub TestForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.ProjectBindingSource.DataSource = My.Application.Context.Projects
    End Sub
    End Class
    

    以下是异常详细信息:

    内部异常:{“索引超出数组的边界。”} 来源:“system.data.entity”

    未处理System.Data.EntityCommandCompilationException message=“准备命令定义时出错。有关详细信息,请参阅内部异常。“ source=“系统.数据.实体” StackTrace: 位于system.data.entityclient.entitycommanddefinition..ctor(dbproviderfactory storeproviderfactory,dbcommandtree commandtree) 在system.data.entityclient.entityproviderservices.createcommanddefinition(dbproviderfactory storeproviderfactory,dbcommandtree commandtree) 在system.data.entityclient.entityproviderservices.createdbcommanddefinition(dbprovidermanifest providermanifest,dbcommandtree commandtree) 在system.data.common.dbProviderServices.createCommandDefinition(dbCommandTree命令树) 在system.data.objects.internal.objectQueryExecutionPlan.prepare(objectContext上下文,dbQueryCommandTree树,类型elementType,mergeOption mergeOption,跨度span) 在system.data.objects.entitySqlQueryState.getExecutionPlan(可为空 1 forMergeOption) at System.Data.Objects.ObjectQuery 1.getResults(可为空 (1个) 在system.data.objects.objectquery 1.获取源列表内部() 在system.data.objects.objectquery.system.componentmodel.IListSource.getList() 在system.windows.forms.listbindinghelper.getlist(对象列表) 在system.windows.forms.listbindinghelper.getlist(对象数据源,字符串数据成员) 位于system.windows.forms.bindingSource.resetList() 在system.windows.forms.bindingSource.set_datasource(对象值) 在testapp.testform.testform加载(对象发送者,eventargs e),位于C:\users\joshpeltier.tfearth\documents\Visual Studio 2008\projects\testapp\testapp\forms\testform.vb:第3行 在system.eventhandler.invoke(对象发送者,eventargs e) 在system.windows.forms.form.onload(事件参数e) 在system.windows.forms.form.onCreateControl() 在system.windows.forms.control.createcontrol(boolean fignorevible) 在system.windows.forms.control.createControl() 在system.windows.forms.control.wmshowwindow(消息&m) 在system.windows.forms.control.wndproc(消息&m) 在system.windows.forms.scrollabelcontrol.wndproc(消息&m) 在system.windows.forms.containerControl.wndproc(消息&m) 在system.windows.forms.form.wmshowwindow(消息&m) 在system.windows.forms.form.wndproc(消息&m) 在system.windows.forms.control.controlNativeWindow.onMessage(消息&m) 在system.windows.forms.control.controlNativeWindow.wndproc(消息&m) 位于system.windows.forms.nativewindow.debuggablecallback(intptr hwnd,int32 msg,intptr wparam,intptr lparam) 在system.windows.forms.safenativemethods.showwindow(handleref hwnd,int32 ncmdshow) 在system.windows.forms.control.setVisibleCore(布尔值) 在system.windows.forms.form.setVisibleCore(布尔值) 在system.windows.forms.control.set_visible(布尔值) 在system.windows.forms.application.threadcontext.runMessageLoopInner(int32原因,applicationContext上下文) 在system.windows.forms.application.threadcontext.runMessageLoop(int32原因,applicationContext上下文) 在system.windows.forms.application.run(applicationContext上下文) 在microsoft.visualbasic.applicationservices.windowsformsapplicationbase.onrun() 在microsoft.visualbasic.applicationservices.windowsformsapplicationbase.doapplicationmodel() 在microsoft.visualbasic.applicationservices.windowsformsapplicationbase.run(string[]命令行) 在17D14F5C-A337-4978-8281-53493378C1071.vb中的testapp.my.myapplication.main(string[]args)处:第81行 位于system.appdomain.\u nexecutasembly(程序集程序集,字符串[]参数) 位于system.appdomain.executeassembly(字符串汇编文件,证据汇编安全性,字符串[]参数) 在microsoft.visualstudio.hostingprocess.hostproc.runusersassembly() 位于system.threading.threadhelper.threadstart_上下文(对象状态) 在system.threading.executioncontext.run(executioncontext executioncontext,contextcallback回调,对象状态) 在system.threading.threadhelper.threadstart() 内部异常:System.IndexAutoFrangeException message=“索引超出数组的边界。” source=“系统.数据.实体” StackTrace: 在system.data.mapping.viewgeneration.structures.cellquery.createfieldalignedcellquerys(cellquery otherquery、memberpathmappbase projectedslotmap、cellquery&newmainquery、cellquery&newotherquery) 在system.data.mapping.viewgeneration.cellnormalizer.alignfields(IEnumerable 1 cells, MemberPathMapBase projectedSlotMap, ViewTarget viewTarget) at System.Data.Mapping.ViewGeneration.CellNormalizer.CreateLeftCellWrappers(IEnumerable 1个扩展单元格,viewTarget viewTarget) 在system.data.mapping.viewgeneration.cellnormalizer..ctor(EntitySetBase范围,IEnumerable 1 extentCells, SchemaContext schemaContext, CqlIdentifiers identifiers, ConfigViewGenerator config, MemberDomainMap queryDomainMap, MemberDomainMap updateDomainMap, StorageEntityContainerMapping entityContainerMapping, MetadataWorkspace workspace) at System.Data.Mapping.ViewGeneration.ViewGenerator.GetCellNormalizer(EntitySetBase extent, SchemaContext schemaContext, CqlIdentifiers identifiers) at System.Data.Mapping.ViewGeneration.ViewGenerator.GenerateViewsForExtent(SchemaContext schemaContext, EntitySetBase extent, CqlIdentifiers identifiers, KeyToListMap 2视图 在system.data.mapping.viewgeneration.viewgenerator.generateViewForSchemaContext(schemaContext schemaContext,cqlidentifiers标识符,keytoListMap 2 views) at System.Data.Mapping.ViewGeneration.ViewGenerator.GenerateAllViews(KeyToListMap 2个视图,cqidentifiers标识符) 在system.data.mapping.viewgeneration.viewgenerator.generateViewForSchemacells(列表 1 cells, MetadataWorkspace workSpace, ConfigViewGenerator config, CqlIdentifiers identifiers, StorageEntityContainerMapping containerMapping) at System.Data.Mapping.ViewGeneration.ViewGenerator.GenerateViewsForSchema(StorageEntityContainerMapping containerMapping, MetadataWorkspace workSpace, ConfigViewGenerator config) at System.Data.Mapping.StorageMappingItemCollection.ViewDictionary.SerializedGenerateViews(EntityContainer container, Dictionary 2结果词典) 在System.Data.Mapping.StorageMappingitemCollection.ViewDictionary.SerializedGetGeneratedViews(EntityContainer容器) 在system.data.common.utils.memoizer 2.<>c__DisplayClass2.<Evaluate>b__0() at System.Data.Common.Utils.Memoizer 2.结果.getValue() 在system.data.common.utils.memoizer 2.Evaluate(TArg arg) at System.Data.Mapping.StorageMappingItemCollection.ViewDictionary.GetGeneratedView(EntitySetBase extent, MetadataWorkspace workspace, StorageMappingItemCollection storageMappingItemCollection) at System.Data.Metadata.Edm.MetadataWorkspace.GetGeneratedView(EntitySetBase extent) at System.Data.Query.PlanCompiler.PreProcessor.ExpandView(Node node, ScanTableOp scanTableOp, IsOfOp& typeFilter) at System.Data.Query.PlanCompiler.PreProcessor.ProcessScanTable(Node scanTableNode, ScanTableOp scanTableOp, IsOfOp& typeFilter) at System.Data.Query.PlanCompiler.PreProcessor.Visit(ScanTableOp op, Node n) at System.Data.Query.InternalTrees.ScanTableOp.Accept[TResultType](BasicOpVisitorOfT 1伏,节点N) 位于system.data.query.internaltrees.basicopvisitoroft 1.VisitNode(Node n) at System.Data.Query.PlanCompiler.PreProcessor.VisitChildren(Node n) at System.Data.Query.PlanCompiler.PreProcessor.VisitRelOpDefault(RelOp op, Node n) at System.Data.Query.PlanCompiler.PreProcessor.Visit(ProjectOp op, Node n) at System.Data.Query.InternalTrees.ProjectOp.Accept[TResultType](BasicOpVisitorOfT 1伏,节点N) 位于system.data.query.internaltrees.basicopvisitoroft 1.VisitNode(Node n) at System.Data.Query.PlanCompiler.PreProcessor.VisitChildren(Node n) at System.Data.Query.InternalTrees.BasicOpVisitorOfNode.VisitDefault(Node n) at System.Data.Query.InternalTrees.BasicOpVisitorOfNode.VisitPhysicalOpDefault(PhysicalOp op, Node n) at System.Data.Query.InternalTrees.BasicOpVisitorOfT 1.访问(PhysicalProjectOP OP,节点N) 在system.data.query.internaltrees.physicalprojectop.accept[tresulttype](BasicOpvisitorSoft 1 v, Node n) at System.Data.Query.InternalTrees.BasicOpVisitorOfT 1.visitnode(节点n) 位于system.data.query.plancompiler.preprocessor.process() 位于system.data.query.plancompiler.preprocessor.process(plancompiler plancompilerstate,structuredtypeinfo&typeinfo) 在system.data.query.plancompiler.plancompiler.compile(列表 1& providerCommands, ColumnMap& resultColumnMap, Int32& columnCount, Set 1实体集) 在system.data.query.plancompiler.plancompiler.compile(dbcommandtree ctree,list 1&ProviderCommands、ColumnMap和ResultColumnMap、Int32&ColumnCount、set 1实体集) 位于system.data.entityclient.entitycommanddefinition..ctor(dbproviderfactory storeproviderfactory,dbcommandtree commandtree) 内部异常:

    有什么想法吗?

    2 回复  |  直到 12 年前
        1
  •  1
  •   Guy Wouters    15 年前

    他们在MSDN论坛上也有同样的问题( http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/fa618214-ad3d-42fc-8506-21d539aa2cb3 )

    看看那里的答案,也许你的模型里有一些不应该有的额外的东西。你能把edmx文件寄出去吗?

        2
  •  1
  •   BlueRaja - Danny Pflughoeft    14 年前

    我也有过这种事。

    问题原来是与结束键的关联,而结束键并不是该实体的主键的一部分!

    例如,在我的.edmx中,我有这样的联想:

    <AssociationSetMapping Name="Table1Table2" TypeName="MyModel.Table1Table2" StoreEntitySet="Table2">
        <EndProperty Name="Table1">
            <ScalarProperty Name="Table1Key" ColumnName="Table1Key" /></EndProperty>
        <EndProperty Name="Table2">
            <ScalarProperty Name="Table2Key" ColumnName="Table2Key" />
            <ScalarProperty Name="Table2OtherColumn" ColumnName="Table2OtherColumn" />
    </EndProperty></AssociationSetMapping>
    

    表2的定义如下:

    <EntityType Name="Table2">
        <Key>
            <PropertyRef Name="Table2Key" />
        </Key>
        <Property Name="Table2Key" Type="int" Nullable="false" />
        <Property Name="Table2OtherColumn" Type="int" Nullable="false" />
        ...other properties...
    </EntityType>
    

    注意到 Table2OtherColumn 在EndProperty中,但不是实际键的一部分 . 从endproperty中删除它修复了该问题。

    注意 实体框架4 (Visual Studio 2010) 可以在编译时检测到这个问题 . 因此,如果您在跟踪导致这种情况的表/属性时遇到严重问题,只需将您的项目加载到VS2010 Express中(在备份之后!)试着编译。