加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 实体框架6运行时错误:“字典中没有给定键”

发布时间:2020-12-15 20:58:15 所属栏目:百科 来源:网络整理
导读:我正在使用EF6代码优先和每个层次结构的表编写ASP.Net应用程序 每当我尝试使用dbcontext执行任何有意义的操作(例如查询,更新等)时,我都会收到此错误: { "Message": "An error has occurred.","ExceptionMessage": "An error occurred while preparing the c
我正在使用EF6代码优先和每个层次结构的表编写ASP.Net应用程序

每当我尝试使用dbcontext执行任何有意义的操作(例如查询,更新等)时,我都会收到此错误:

{
  "Message": "An error has occurred.","ExceptionMessage": "An error occurred while preparing the command definition. See the inner exception for details.","ExceptionType": "System.Data.Entity.Core.EntityCommandCompilationException","StackTrace": "  at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition..ctor(DbProviderFactory storeProviderFactory,DbCommandTree commandTree,DbInterceptionContext interceptionContext,IDbDependencyResolver resolver,BridgeDataReaderFactory bridgeDataReaderFactory,ColumnMapFactory columnMapFactory)rn  at System.Data.Entity.Core.EntityClient.Internal.EntityProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest,DbInterceptionContext interceptionContext)rn  at System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlanFactory.CreateCommandDefinition(ObjectContext context,DbQueryCommandTree tree)rn  at System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlanFactory.Prepare(ObjectContext context,DbQueryCommandTree tree,Type elementType,MergeOption mergeOption,Boolean streaming,Span span,IEnumerable`1 compiledQueryParameters,AliasGenerator aliasGenerator)rn  at System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)rn  at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__6()rn  at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func,IDbExecutionStrategy executionStrategy,Boolean startLocalTransaction,Boolean releaseConnectionOnSuccess)rn  at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__5()rn  at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)rn  at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)rn  at System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0()rn  at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()rn  at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)rn  at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)rn  at SealingServer.Controllers.PdfsController.<PostPdf>d__4.MoveNext() in C:Usersthoma_000DocumentsAll CodeSealingServerSealingServerControllersPdfsController.cs:line 93rn--- End of stack trace from previous location where exception was thrown ---rn  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn  at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()rn  at System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__3`1.MoveNext()rn--- End of stack trace from previous location where exception was thrown ---rn  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn  at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()rn  at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()rn--- End of stack trace from previous location where exception was thrown ---rn  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn  at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()rn  at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()rn--- End of stack trace from previous location where exception was thrown ---rn  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn  at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()rn  at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()","InnerException": {
    "Message": "An error has occurred.","ExceptionMessage": "The given key was not present in the dictionary.","ExceptionType": "System.Collections.Generic.KeyNotFoundException","StackTrace": "  at System.Collections.Generic.Dictionary`2.get_Item(TKey key)rn  at System.Data.Entity.Core.Mapping.ViewGeneration.Structures.MemberDomainMap.GetDomainInternal(MemberPath path)rn  at System.Data.Entity.Core.Mapping.ViewGeneration.QueryRewriting.FragmentQueryKB.CreateIsOfTypeCondition(MemberPath currentPath,IEnumerable`1 derivedTypes,MemberDomainMap domainMap)rn  at System.Data.Entity.Core.Mapping.ViewGeneration.QueryRewriting.FragmentQueryKB.CreateVariableConstraintsRecursion(EdmType edmType,MemberPath currentPath,MemberDomainMap domainMap,EdmItemCollection edmItemCollection)rn  at System.Data.Entity.Core.Mapping.ViewGeneration.QueryRewriting.FragmentQueryKB.CreateVariableConstraintsRecursion(EdmType edmType,EdmItemCollection edmItemCollection)rn  at System.Data.Entity.Core.Mapping.ViewGeneration.ViewgenContext..ctor(ViewTarget viewTarget,EntitySetBase extent,IList`1 extentCells,CqlIdentifiers identifiers,ConfigViewGenerator config,MemberDomainMap queryDomainMap,MemberDomainMap updateDomainMap,EntityContainerMapping entityContainerMapping)rn  at System.Data.Entity.Core.Mapping.ViewGeneration.ViewGenerator.CreateViewgenContext(EntitySetBase extent,ViewTarget viewTarget,CqlIdentifiers identifiers)rn  at System.Data.Entity.Core.Mapping.ViewGeneration.ViewGenerator.GenerateDirectionalViewsForExtent(ViewTarget viewTarget,KeyToListMap`2 views)rn  at System.Data.Entity.Core.Mapping.ViewGeneration.ViewGenerator.GenerateDirectionalViews(ViewTarget viewTarget,KeyToListMap`2 views)rn  at System.Data.Entity.Core.Mapping.ViewGeneration.ViewGenerator.GenerateAllBidirectionalViews(KeyToListMap`2 views,CqlIdentifiers identifiers)rn  at System.Data.Entity.Core.Mapping.ViewGeneration.ViewgenGatekeeper.GenerateViewsFromCells(List`1 cells,EntityContainerMapping containerMapping)rn  at System.Data.Entity.Core.Mapping.StorageMappingItemCollection.ViewDictionary.SerializedGenerateViews(EntityContainerMapping entityContainerMap,Dictionary`2 resultDictionary)rn  at System.Data.Entity.Core.Mapping.StorageMappingItemCollection.ViewDictionary.SerializedGetGeneratedViews(EntityContainer container)rn  at System.Data.Entity.Core.Common.Utils.Memoizer`2.Result.GetValue()rn  at System.Data.Entity.Core.Common.Utils.Memoizer`2.Evaluate(TArg arg)rn  at System.Data.Entity.Core.Mapping.StorageMappingItemCollection.ViewDictionary.GetGeneratedView(EntitySetBase extent,MetadataWorkspace workspace,StorageMappingItemCollection storageMappingItemCollection)rn  at System.Data.Entity.Core.Metadata.Edm.MetadataWorkspace.GetGeneratedView(EntitySetBase extent)rn  at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.ExpandView(ScanTableOp scanTableOp,IsOfOp& typeFilter)rn  at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.ProcessScanTable(Node scanTableNode,ScanTableOp scanTableOp,IsOfOp& typeFilter)rn  at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.Visit(ScanTableOp op,Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitRelOpDefault(RelOp op,Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.Visit(FilterOp op,Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)rn  at System.Data.Entity.Core.Query.InternalTrees.BasicOpVisitorOfNode.VisitDefault(Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.VisitScalarOpDefault(ScalarOp op,Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.VisitNavPropertyOp(PropertyOp op,Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.Visit(PropertyOp op,Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.VisitScalarOpDefault(ScalarOp op,Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)rn  at System.Data.Entity.Core.Query.InternalTrees.BasicOpVisitorOfNode.VisitDefault(Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)rn  at System.Data.Entity.Core.Query.InternalTrees.BasicOpVisitorOfNode.VisitDefault(Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitRelOpDefault(RelOp op,Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.Visit(ProjectOp op,Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)rn  at System.Data.Entity.Core.Query.InternalTrees.BasicOpVisitorOfNode.VisitDefault(Node n)rn  at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.Process(Dictionary`2& tvfResultKeys)rn  at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.Process(PlanCompiler planCompilerState,StructuredTypeInfo& typeInfo,Dictionary`2& tvfResultKeys)rn  at System.Data.Entity.Core.Query.PlanCompiler.PlanCompiler.Compile(List`1& providerCommands,ColumnMap& resultColumnMap,Int32& columnCount,Set`1& entitySets)rn  at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition..ctor(DbProviderFactory storeProviderFactory,ColumnMapFactory columnMapFactory)"
  }
}

编辑

我从一个新的数据库开始,我得到任何实体的相同结果.这让我相信它与我的DbContext有关.它看起来像这样:

public class SealingServerContext : DbContext
    {
        public SealingServerContext() : base("name=TFMContext")
        {
            this.Database.Log = Console.Write;
            this.Configuration.LazyLoadingEnabled = false;
        }
    public DbSet<Organization> Organizations { get; set; }

    public DbSet<User> Users { get; set; }

    public DbSet<Role> Roles { get; set; }

    public DbSet<ReviewerRole> ReviewerRoles { get; set; }
    public DbSet<AnnotationTemplate> AnnotationTemplates { get; set; }
    public DbSet<PaperItem> PaperItems { get; set; }
    public DbSet<PaperRaster> PaperRasters { get; set; }

    public DbSet<EngineerRole> EngineerRoles { get; set; }
    public DbSet<Seal> Seals { get; set; }
    public DbSet<Signature> Signatures { get; set; }


    public DbSet<Job> Jobs { get; set; }
    public DbSet<JobFile> JobFiles { get; set; }
    public DbSet<Pdf> Pdfs { get; set; }
    public DbSet<PdfPage> PdfPages { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<AnnotationTemplate>()
            .HasKey(annotationTemplate => annotationTemplate.ID);

        modelBuilder.Entity<JobFile>()
            .HasKey(pdf => pdf.ID);
        modelBuilder.Entity<Pdf>()
            .HasKey(pdf => pdf.ID)
            .HasMany(pdf => pdf.PdfPages)
            .WithRequired()
            .HasForeignKey(pdfPage => pdfPage.Pdf_ID)
            .WillCascadeOnDelete(true);

        modelBuilder.Entity<Job>()
            .HasKey(job => job.ID);
        modelBuilder.Entity<Job>()
            .HasMany(job => job.Files)
            .WithRequired()
            .HasForeignKey(jobFile => jobFile.Job_ID);
        modelBuilder.Entity<Job>()
            .HasMany(job => job.Regions)
            .WithRequired()
            .HasForeignKey(region => region.Job_ID);

        modelBuilder.Entity<Organization>()
            .HasKey(organization => organization.ID)
            .HasMany(org => org.Users)
            .WithRequired()
            .HasForeignKey(user => user.Organization_ID);

        modelBuilder.Entity<PaperItem>()
            .HasKey(paperItem => paperItem.ID);

        modelBuilder.Entity<PaperRaster>()
            .HasKey(paperRaster => paperRaster.ID);

        modelBuilder.Entity<Models.Files.PdfPage>()
            .HasKey(pdfPage => pdfPage.ID);

        modelBuilder.Entity<Region>()
            .HasKey(region => region.ID);

        modelBuilder.Entity<Role>()
            .HasKey(role => role.ID);

        modelBuilder.Entity<EngineerRole>()
            .HasKey(role => role.ID);
        modelBuilder.Entity<EngineerRole>()
            .HasMany(engineerRole => engineerRole.Seals)
            .WithRequired()
            .HasForeignKey(seal => seal.EngineerRole_ID);
        modelBuilder.Entity<EngineerRole>()
            .HasMany(engineerRole => engineerRole.Signatures)
            .WithRequired()
            .HasForeignKey(signature => signature.EngineerRole_ID);

        modelBuilder.Entity<EngineerAdminRole>()
            .HasKey(role => role.ID);

        modelBuilder.Entity<ReviewerAdminRole>()
            .HasKey(role => role.ID);

        modelBuilder.Entity<ReviewerRole>()
            .HasKey(reviewerRole => reviewerRole.ID)
            .HasMany(reviewerRole => reviewerRole.AnnotationTemplates)
            .WithOptional()
            .HasForeignKey(annotation => annotation.ReviewerRole_ID);

        modelBuilder.Entity<Seal>()
            .HasKey(seal => seal.ID);

        modelBuilder.Entity<Signature>()
            .HasKey(signature => signature.ID);

        modelBuilder.Entity<User>()
            .HasKey(user => user.ID);
        modelBuilder.Entity<User>()
            .HasMany(user => user.Roles)
            .WithOptional()
            .HasForeignKey(role => role.User_ID);
    }
}

EDIT2

我一直在评论事情并进行数据库迁移,并将其缩小到这个继承层次结构:

[KnownType(typeof(PaperRaster))]
public class PaperItem
{
    public int ID { get; set; }

    public PointF PdfPosition { get; set; }

    public string ItemType { get; set; }

    public virtual void Move(PointF coordinatesTranslation)
    {
    }

    protected PaperItem(string paperItemType,PointF pdfPosition)
    {
        ItemType = paperItemType;
        PdfPosition = pdfPosition;
    }

    public virtual PaperItem DeepCopy()
    {
        return new PaperItem("PaperItem",new PointF());
    }


    public virtual string ToJson()
    {
        //turn all of my properties into Json
        return "";
    }
}

及其子类:

public class PaperRaster : PaperItem
{
    public string Source { get; set; }
    public string CrossOrigin { get; set; }
    public Matrix Matrix { get; set; }

    public PaperRaster(string source,string crossOrigin,Matrix matrix,PointF pdfPosition)
        : base("Raster",pdfPosition)
    {
        this.Source = source;
        this.CrossOrigin = crossOrigin;
        this.Matrix = matrix;
    }

    public PaperRaster(string json) : base("Raster",new PointF())
    {
        JArray array = JArray.Parse(json);

        JToken type = array[0];
        JToken properties = array[1];
        JToken position = array[2]["pdfPosition"];


        if (type.ToString() != "Raster")
        {
            throw new Exception("Not a PaperRaster");
        }

        var matrix = properties["matrix"];
        this.Matrix = new Matrix(float.Parse(matrix[0].ToString()),float.Parse(matrix[1].ToString()),float.Parse(matrix[2].ToString()),float.Parse(matrix[3].ToString()),float.Parse(matrix[4].ToString()),float.Parse(matrix[5].ToString()));

        // Custom encoded properties

        // Bottom left point of annotation (that's how iTextSharp inserts it)

        var x = position["x"].ToString();
        var y = position["y"].ToString();

        this.PdfPosition = new PointF()
        {
            X = float.Parse(x),Y = float.Parse(y)
        };
    }

    public override void Move(PointF coordinatesTranslation)
    {
        this.Matrix.Translate(coordinatesTranslation.X,coordinatesTranslation.Y);
    }

    public override PaperItem DeepCopy()
    {
        return new PaperRaster(this.Source,this.CrossOrigin,this.Matrix,this.PdfPosition);
    }

    public override string ToJson()
    {
        //turn all of my properties into Json
        return "";
    }
}

如果我注释掉子类并执行数据库迁移.一切都回归工作.此继承层次结构中的内容导致EF错误地生成表

其他说明

奇怪的旁注,这样做有效:

var result = context.dbset.Single(x => x.ID == 10000);

但是使用Find就像这样:

var result = context.dbset.Find(10000);

导致上面的错误.

解决方法

我已经找到了问题,它与派生实体中的未映射属性有关(并且也可能在未映射整个派生类时发生).我在 this答案中更好地描述了它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读