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() {
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()));
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.