Entity Framework 6 Runtime Error: "this key was not in the dictionary"

I am writing an ASP.Net application using EF6 code and a table for each hierarchy

I get this error whenever I try to do something meaningful with my dbcontext (e.g. request, update, etc.):

{ "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)\r\n at System.Data.Entity.Core.EntityClient.Internal.EntityProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree, DbInterceptionContext interceptionContext)\r\n at System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlanFactory.CreateCommandDefinition(ObjectContext context, DbQueryCommandTree tree)\r\n 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)\r\n at System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)\r\n at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__6()\r\n at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)\r\n at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__5()\r\n at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)\r\n at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)\r\n at System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0()\r\n at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()\r\n at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)\r\n at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)\r\n at SealingServer.Controllers.PdfsController.<PostPdf>d__4.MoveNext() in C:\Users\thoma_000\Documents\All Code\SealingServer\SealingServer\Controllers\PdfsController.cs:line 93\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n at System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__3`1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n 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)\r\n at System.Data.Entity.Core.Mapping.ViewGeneration.Structures.MemberDomainMap.GetDomainInternal(MemberPath path)\r\n at System.Data.Entity.Core.Mapping.ViewGeneration.QueryRewriting.FragmentQueryKB.CreateIsOfTypeCondition(MemberPath currentPath, IEnumerable`1 derivedTypes, MemberDomainMap domainMap)\r\n at System.Data.Entity.Core.Mapping.ViewGeneration.QueryRewriting.FragmentQueryKB.CreateVariableConstraintsRecursion(EdmType edmType, MemberPath currentPath, MemberDomainMap domainMap, EdmItemCollection edmItemCollection)\r\n at System.Data.Entity.Core.Mapping.ViewGeneration.QueryRewriting.FragmentQueryKB.CreateVariableConstraintsRecursion(EdmType edmType, MemberPath currentPath, MemberDomainMap domainMap, EdmItemCollection edmItemCollection)\r\n 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)\r\n at System.Data.Entity.Core.Mapping.ViewGeneration.ViewGenerator.CreateViewgenContext(EntitySetBase extent, ViewTarget viewTarget, CqlIdentifiers identifiers)\r\n at System.Data.Entity.Core.Mapping.ViewGeneration.ViewGenerator.GenerateDirectionalViewsForExtent(ViewTarget viewTarget, EntitySetBase extent, CqlIdentifiers identifiers, KeyToListMap`2 views)\r\n at System.Data.Entity.Core.Mapping.ViewGeneration.ViewGenerator.GenerateDirectionalViews(ViewTarget viewTarget, CqlIdentifiers identifiers, KeyToListMap`2 views)\r\n at System.Data.Entity.Core.Mapping.ViewGeneration.ViewGenerator.GenerateAllBidirectionalViews(KeyToListMap`2 views, CqlIdentifiers identifiers)\r\n at System.Data.Entity.Core.Mapping.ViewGeneration.ViewgenGatekeeper.GenerateViewsFromCells(List`1 cells, ConfigViewGenerator config, CqlIdentifiers identifiers, EntityContainerMapping containerMapping)\r\n at System.Data.Entity.Core.Mapping.StorageMappingItemCollection.ViewDictionary.SerializedGenerateViews(EntityContainerMapping entityContainerMap, Dictionary`2 resultDictionary)\r\n at System.Data.Entity.Core.Mapping.StorageMappingItemCollection.ViewDictionary.SerializedGetGeneratedViews(EntityContainer container)\r\n at System.Data.Entity.Core.Common.Utils.Memoizer`2.Result.GetValue()\r\n at System.Data.Entity.Core.Common.Utils.Memoizer`2.Evaluate(TArg arg)\r\n at System.Data.Entity.Core.Mapping.StorageMappingItemCollection.ViewDictionary.GetGeneratedView(EntitySetBase extent, MetadataWorkspace workspace, StorageMappingItemCollection storageMappingItemCollection)\r\n at System.Data.Entity.Core.Metadata.Edm.MetadataWorkspace.GetGeneratedView(EntitySetBase extent)\r\n at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.ExpandView(ScanTableOp scanTableOp, IsOfOp& typeFilter)\r\n at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.ProcessScanTable(Node scanTableNode, ScanTableOp scanTableOp, IsOfOp& typeFilter)\r\n at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.Visit(ScanTableOp op, Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitRelOpDefault(RelOp op, Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.Visit(FilterOp op, Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)\r\n at System.Data.Entity.Core.Query.InternalTrees.BasicOpVisitorOfNode.VisitDefault(Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.VisitScalarOpDefault(ScalarOp op, Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.VisitNavPropertyOp(PropertyOp op, Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.Visit(PropertyOp op, Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.VisitScalarOpDefault(ScalarOp op, Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)\r\n at System.Data.Entity.Core.Query.InternalTrees.BasicOpVisitorOfNode.VisitDefault(Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)\r\n at System.Data.Entity.Core.Query.InternalTrees.BasicOpVisitorOfNode.VisitDefault(Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitRelOpDefault(RelOp op, Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.Visit(ProjectOp op, Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitRelOpDefault(RelOp op, Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.Visit(ProjectOp op, Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n)\r\n at System.Data.Entity.Core.Query.InternalTrees.BasicOpVisitorOfNode.VisitDefault(Node n)\r\n at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.Process(Dictionary`2& tvfResultKeys)\r\n at System.Data.Entity.Core.Query.PlanCompiler.PreProcessor.Process(PlanCompiler planCompilerState, StructuredTypeInfo& typeInfo, Dictionary`2& tvfResultKeys)\r\n at System.Data.Entity.Core.Query.PlanCompiler.PlanCompiler.Compile(List`1& providerCommands, ColumnMap& resultColumnMap, Int32& columnCount, Set`1& entitySets)\r\n at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition..ctor(DbProviderFactory storeProviderFactory, DbCommandTree commandTree, DbInterceptionContext interceptionContext, IDbDependencyResolver resolver, BridgeDataReaderFactory bridgeDataReaderFactory, ColumnMapFactory columnMapFactory)" } } 

EDIT

I started with a new database and I get the same result for any object. This makes me think that this is related to my DbContext. It looks like this:

 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

I commented on the situation and did the db migrations and narrowed it down to this inheritance hierarchy:

 [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 ""; } } 

and its child class:

 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 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 ""; } } 

If I comment on the child class and do the db migration. Everything is back to work. What in this inheritance hierarchy causes EF to incorrectly generate tables

Other notes

Strange seat that does this:

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

However, using Find like this:

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

causes the error above.

+4
source share
2 answers

I figured out this problem for me, it was related to a non-displayable property inside the derived object (and can also happen when the whole derived class is not displayed ). I described it better in this answer.

+1
source

I believe that this is due to the fact that you do not have a primary key, which excludes the use of Find , since it only works with the primary key.

You can set the primary key implicitly by adding a column that conforms to the naming standard:

 Dog === Id || DogId 

Please note that you provided the ID , therefore the case is incorrect.

You can also set the key explicitly by decorating the property with [Key] .

-1
source

Source: https://habr.com/ru/post/1237379/


All Articles