The entity type <class> is not part of the model for the current context
ef-model-first, entity, entity-framework, entity-framework-4.1
Solution
After 3 (4) days (depending on how you view days, I separate days by when I sleep and not necessarily when the sun goes down/comes up), I found the answer. In the EDMX file above, I have a column named LeadTakenDate, in the WorkOrderHeader class, I used the field name LeadTaken. This was a stupid error on my part.
How can this benefit you possibly? Here is how I resolved the problem:
First I isolated the problem to exactly one area by MOQing out parts to see how far down the rabbit hole the problem was. Once I figured out the problem was in the DatabaseContext, I wrote a test case that created a working and a non working use case. This isolated the problem and allowed me to test theories to fix it quicker. I tried a thousand different things before trying to use the EF 5.x persistance ignorant poco generator. I commented out all of my code in the WorkOrderHeader class and copied the generated code in. Reran my tests and they worked, so I started uncommenting my properties and commenting out the generated code then rerunning my test until I hit the appropriate property.
The error message is cryptic enough that is can be very difficult to trouble shoot.
Problem
This is a MODEL first approach. I have already researched this extensiely and have not come up with an answer. I have tried all the suggestions at the following links: This appears to be the same problem but with no resolution The entity type <classname> is not part of the model for the current context These are the links I have already researched so please don't answer as duplicate of ---- EF 4.1 Code First error - The entity type SomeType is not part of the model for the current context The entity type is not part of the model, EF 5 Here is the EDMX (Abbreviated for brevity): ``` <?xml version="1.0" encoding="utf-8"?> <edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx"> <!-- EF Runtime content --> <edmx:Runtime> <!-- SSDL content --> <edmx:StorageModels> <Schema Namespace="Insight_Model.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl"> <EntityContainer Name="Insight_ModelStoreContainer"> <EntitySet Name="vwCompanyHeader" EntityType="Insight_Model.Store.vwCompanyHeader" store:Type="Views" store:Schema="dbo" store:Name="vwCompanyHeader"> <DefiningQuery>SELECT [vwCompanyHeader].[ID] AS [ID], [vwCompanyHeader].[Name] AS [Name], [vwCompanyHeader].[Active] AS [Active], [vwCompanyHeader].[Creator] AS [Creator], [vwCompanyHeader].[Created] AS [Created], [vwCompanyHeader].[Modifier] AS [Modifier], [vwCompanyHeader].[Modified] AS [Modified] FROM [dbo].[vwCompanyHeader] AS [vwCompanyHeader]</DefiningQuery> </EntitySet> <EntitySet Name="vwWorkOrderHeader" EntityType="Insight_Model.Store.vwWorkOrderHeader" store:Type="Views" store:Schema="dbo" store:Name="vwWorkOrderHeader"> <DefiningQuery>SELECT [vwWorkOrderHeader].[ID] AS [ID], [vwWorkOrderHeader].[Active] AS [Active], [vwWorkOrderHeader].[Name] AS [Name], [vwWorkOrderHeader].[Creator] AS [Creator], [vwWorkOrderHeader].[Created] AS [Created], [vwWorkOrderHeader].[Modifier] AS [Modifier], [vwWorkOrderHeader].[Modified] AS [Modified], [vwWorkOrderHeader].[Leader] AS [Leader], [vwWorkOrderHeader].[LeadTakenDate] AS [LeadTakenDate], [vwWorkOrderHeader].[ProjectID] AS [ProjectID], [vwWorkOrderHeader].[ProjectName] AS [ProjectName], [vwWorkOrderHeader].[WorkOrderStatus] AS [WorkOrderStatus], [vwWorkOrderHeader].[WorkOrderSubStatus] AS [WorkOrderSubStatus], [vwWorkOrderHeader].[WorkOrderType] AS [WorkOrderType], [vwWorkOrderHeader].[WorkOrderSubType] AS [WorkOrderSubType], [vwWorkOrderHeader].[WorkOrderPriority] AS [WorkOrderPriority], [vwWorkOrderHeader].[RefNumber] AS [RefNumber], [vwWorkOrderHeader].[Request] AS [Request] FROM [dbo].[vwWorkOrderHeader] AS [vwWorkOrderHeader]</DefiningQuery> </EntitySet> </EntityContainer> <EntityType Name="vwCompanyHeader"> <Key> <PropertyRef Name="ID" /> </Key> <Property Name="ID" Type="int" Nullable="false" /> <Property Name="Name" Type="varchar" Nullable="false" MaxLength="50" /> <Property Name="Active" Type="bit" Nullable="false" /> <Property Name="Creator" Type="varchar" Nullable="false" MaxLength="51" /> <Property Name="Created" Type="date" Nullable="false" /> <Property Name="Modifier" Type="varchar" Nullable="false" MaxLength="51" /> <Property Name="Modified" Type="date" Nullable="false" /> </EntityType> <EntityType Name="vwWorkOrderHeader"> <Key> <PropertyRef Name="ID" /> </Key> <Property Name="ID" Type="int" Nullable="false" /> <Property Name="Active" Type="bit" Nullable="false" /> <Property Name="Name" Type="varchar" Nullable="false" MaxLength="15" /> <Property Name="Creator" Type="varchar" Nullable="false" MaxLength="51" /> <Property Name="Created" Type="date" Nullable="false" /> <Property Name="Modifier" Type="varchar" Nullable="false" MaxLength="51" /> <Property Name="Modified" Type="date" Nullable="false" /> <Property Name="Leader" Type="varchar" Nullable="false" MaxLength="51" /> <Property Name="LeadTakenDate" Type="date" Nullable="false" /> <Property Name="ProjectID" Type="int" Nullable="false" /> <Property Name="ProjectName" Type="varchar" Nullable="false" MaxLength="15" /> <Property Name="WorkOrderStatus" Type="varchar" Nullable="false" MaxLength="35" /> <Property Name="WorkOrderSubStatus" Type="varchar" Nullable="false" MaxLength="35" /> <Property Name="WorkOrderType" Type="varchar" Nullable="false" MaxLength="35" /> <Property Name="WorkOrderSubType" Type="varchar" Nullable="false" MaxLength="35" /> <Property Name="WorkOrderPriority" Type="varchar" Nullable="false" MaxLength="35" /> <Property Name="RefNumber" Type="varchar" Nullable="false" MaxLength="25" /> <Property Name="Request" Type="varchar" Nullable="false" MaxLength="1500" /> </EntityType> </Schema></edmx:StorageModels> <!-- CSDL content --> <edmx:ConceptualModels> <Schema Namespace="Insight_Model" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm"> <EntityContainer Name="Insight_Entities" annotation:LazyLoadingEnabled="false"> <EntitySet Name="CompanyHeaders" EntityType="Insight_Model.CompanyHeader" /> <EntitySet Name="WorkOrderHeaders" EntityType="Insight_Model.WorkOrderHeader" /> </EntityContainer> <EntityType Name="CompanyHeader"> <Key> <PropertyRef Name="ID" /> </Key> <Property Type="String" Name="Name" MaxLength="50" FixedLength="false" Unicode="false" Nullable="false" /> <Property Type="Boolean" Name="Active" Nullable="false" /> <Property Type="String" Name="Creator" Nullable="false" MaxLength="51" FixedLength="false" Unicode="false" /> <Property Type="DateTime" Name="Created" Nullable="false" /> <Property Type="String" Name="Modifier" Nullable="false" MaxLength="51" FixedLength="false" Unicode="false" /> <Property Type="DateTime" Name="Modified" Nullable="false" /> <Property Type="Int32" Name="ID" Nullable="false" /> </EntityType> <EntityType Name="WorkOrderHeader"> <Key> <PropertyRef Name="ID" /> </Key> <Property Type="Int32" Name="ID" Nullable="false" /> <Property Type="Boolean" Name="Active" Nullable="false" /> <Property Type="String" Name="Name" Nullable="false" MaxLength="15" FixedLength="false" Unicode="false" /> <Property Type="String" Name="Creator" Nullable="false" MaxLength="51" FixedLength="false" Unicode="false" /> <Property Type="DateTime" Name="Created" Nullable="false" /> <Property Type="String" Name="Modifier" Nullable="false" MaxLength="51" FixedLength="false" Unicode="false" /> <Property Type="DateTime" Name="Modified" Nullable="false" /> <Property Type="String" Name="Leader" Nullable="false" MaxLength="51" FixedLength="false" Unicode="false" /> <Property Type="DateTime" Name="LeadTakenDate" Nullable="false" /> <Property Type="Int32" Name="ProjectID" Nullable="false" /> <Property Type="String" Name="ProjectName" Nullable="false" MaxLength="15" FixedLength="false" Unicode="false" /> <Property Type="String" Name="WorkOrderStatus" Nullable="false" MaxLength="35" FixedLength="false" Unicode="false" /> <Property Type="String" Name="WorkOrderSubStatus" Nullable="false" MaxLength="35" FixedLength="false" Unicode="false" /> <Property Type="String" Name="WorkOrderType" Nullable="false" MaxLength="35" FixedLength="false" Unicode="false" /> <Property Type="String" Name="WorkOrderSubType" Nullable="false" MaxLength="35" FixedLength="false" Unicode="false" /> <Property Type="String" Name="WorkOrderPriority" Nullable="false" MaxLength="35" FixedLength="false" Unicode="false" /> <Property Type="String" Name="RefNumber" MaxLength="25" Nullable="false" FixedLength="false" Unicode="false" /> <Property Type="String" Name="Request" Nullable="false" MaxLength="1500" FixedLength="false" Unicode="false" /> </EntityType> </Schema> </edmx:ConceptualModels> <!-- C-S mapping content --> <edmx:Mappings> <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs"> <EntityContainerMapping StorageEntityContainer="Insight_ModelStoreContainer" CdmEntityContainer="Insight_Entities"> <EntitySetMapping Name="CompanyHeaders"> <EntityTypeMapping TypeName="Insight_Model.CompanyHeader"> <MappingFragment StoreEntitySet="vwCompanyHeader"> <ScalarProperty Name="ID" ColumnName="ID" /> <ScalarProperty Name="Modified" ColumnName="Modified" /> <ScalarProperty Name="Modifier" ColumnName="Modifier" /> <ScalarProperty Name="Created" ColumnName="Created" /> <ScalarProperty Name="Creator" ColumnName="Creator" /> <ScalarProperty Name="Active" ColumnName="Active" /> <ScalarProperty Name="Name" ColumnName="Name" /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping> <EntitySetMapping Name="WorkOrderHeaders"> <EntityTypeMapping TypeName="Insight_Model.WorkOrderHeader"> <MappingFragment StoreEntitySet="vwWorkOrderHeader"> <ScalarProperty Name="Request" ColumnName="Request" /> <ScalarProperty Name="RefNumber" ColumnName="RefNumber" /> <ScalarProperty Name="WorkOrderPriority" ColumnName="WorkOrderPriority" /> <ScalarProperty Name="WorkOrderSubType" ColumnName="WorkOrderSubType" /> <ScalarProperty Name="WorkOrderType" ColumnName="WorkOrderType" /> <ScalarProperty Name="WorkOrderSubStatus" ColumnName="WorkOrderSubStatus" /> <ScalarProperty Name="WorkOrderStatus" ColumnName="WorkOrderStatus" /> <ScalarProperty Name="ProjectName" ColumnName="ProjectName" /> <ScalarProperty Name="ProjectID" ColumnName="ProjectID" /> <ScalarProperty Name="LeadTakenDate" ColumnName="LeadTakenDate" /> <ScalarProperty Name="Leader" ColumnName="Leader" /> <ScalarProperty Name="Modified" ColumnName="Modified" /> <ScalarProperty Name="Modifier" ColumnName="Modifier" /> <ScalarProperty Name="Created" ColumnName="Created" /> <ScalarProperty Name="Creator" ColumnName="Creator" /> <ScalarProperty Name="Name" ColumnName="Name" /> <ScalarProperty Name="Active" ColumnName="Active" /> <ScalarProperty Name="ID" ColumnName="ID" /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping> </EntityContainerMapping> </Mapping> </edmx:Mappings> ``` The repository code: ``` Imports System.Linq.Expressions Imports System.Data.Entity.Infrastructure Imports System.Data.Entity Public Class Repository(Of T As {Class, IEntity}) Implements IRepository(Of T) #Region "Attributes" Private objectContext As IDatabaseContext Protected objectSet As IDbSet(Of T) #End Region Public Sub New(objContext As IDatabaseContext) objectContext = objContext objectSet = objectContext.Set(Of T)() End Sub Public Function FindAll() As IQueryable(Of T) Implements IRepository(Of T).FindAll Return objectSet End Function Public Function FindWhere(predicate As Expressions.Expression(Of System.Func(Of T, Boolean))) As System.Linq.IQueryable(Of T) Implements Interfaces.IRepository(Of T).FindWhere Return objectSet.Where(predicate) End Function Public Function FindById(id As Integer) As T Implements IRepository(Of T).FindById Return objectSet.Single(Function(o) o.ID = id) End Function Public Sub Add(newEntity As T) Implements IRepository(Of T).Add objectSet.Add(newEntity) End Sub Public Sub Remove(entity As T) Implements IRepository(Of T).Remove objectSet.Remove(entity) End Sub Public Function Count(Optional predicate As Expression(Of Func(Of T, Boolean)) = Nothing) As Integer Implements IRepository(Of T).Count Return If((predicate Is Nothing), objectSet.Count, objectSet.Where(predicate).Count) End Function Public Function Exist(Optional predicate As Expression(Of Func(Of T, Boolean)) = Nothing) As Boolean Implements IRepository(Of T).Exist Return If((predicate Is Nothing), objectSet.Any, objectSet.Where(predicate).Any) End Function End Class ``` The DatabaseContext code: ``` Imports System.Data.Entity Imports Insight.DataLayer.Interfaces Imports System.Data.Objects Imports System.Configuration Public Class DatabaseContext Inherits DbContext Implements IDatabaseContext Const defaultConnectStringName = "Insight_Entities" Public Sub New() Me.New(ConfigurationManager.ConnectionStrings(defaultConnectStringName).ConnectionString) End Sub Public Sub New(connectionString As String) MyBase.New(connectionString) MyBase.Configuration.LazyLoadingEnabled = False MyBase.Configuration.ProxyCreationEnabled = False End Sub Public Overloads Sub SaveChanges() Implements Interfaces.IDatabaseContext.SaveChanges MyBase.SaveChanges() End Sub Public Overloads Function [Set](Of T As Class)() As System.Data.Entity.IDbSet(Of T) Implements Interfaces.IDatabaseContext.Set Return MyBase.Set(Of T)() End Function End Class ``` And the 2 class files: WorkOrderHeader: ``` Imports System.ComponentModel.DataAnnotations Imports System.Collections.ObjectModel Imports System.Runtime.Serialization Imports System.Data.Services.Common Partial Public Class WorkOrderHeader Inherits DataTransferObjectHeaderBase Public Sub New() End Sub Public Sub New(iID As Integer, sName As String, bActive As Boolean, sCreator As String, dtCreated As DateTime, sModifier As String, dtModified As DateTime, sLeader As String, dtLeadTaken As Date, iProjectID As Integer, sProjectName As String, sWorkOrderStatus As String, sWorkOrderSubStatus As String, sWorkOrderType As String, sWorkOrderSubType As String, sWorkOrderPriority As String, sRequest As String) Me.New(iID, sName, bActive, sCreator, dtCreated, sModifier, dtModified, sLeader, dtLeadTaken, iProjectID, sProjectName, sWorkOrderStatus, sWorkOrderSubStatus, sWorkOrderType, sWorkOrderSubType, sWorkOrderPriority, "", sRequest) End Sub Public Sub New(iID As Integer, sName As String, bActive As Boolean, sCreator As String, dtCreated As DateTime, sModifier As String, dtModified As DateTime, sLeader As String, dtLeadTaken As Date, iProjectID As Integer, sProjectName As String, sWorkOrderStatus As String, sWorkOrderSubStatus As String, sWorkOrderType As String, sWorkOrderSubType As String, sWorkOrderPriority As String, sRefNumber As String, sRequest As String) ID = iID Name = sName Active = bActive Creator = sCreator Created = dtCreated Modifier = sModifier Modified = dtModified Leader = sLeader LeadTaken = dtLeadTaken ProjectID = iProjectID ProjectName = sProjectName WorkOrderStatus = sWorkOrderStatus WorkOrderSubStatus = sWorkOrderSubStatus WorkOrderType = sWorkOrderType WorkOrderSubType = sWorkOrderSubType WorkOrderPriority = sWorkOrderPriority RefNumber = sRefNumber Request = sRequest End Sub <DataMember()> _ Public Property Leader() As String Get Return _leader End Get Set(value As String) _leader = value End Set End Property Private _leader As String <DataMember()> _ Public Property LeadTaken() As Date Get Return _leadTaken End Get Set(value As Date) _leadTaken = value End Set End Property Private _leadTaken As Date <DataMember()> _ Public Property ProjectID() As Int32 Get Return _projectID End Get Set(value As Int32) If (_projectID <> value) Then _projectID = value End If End Set End Property Private _projectID As Int32 <DataMember()> _ Public Property ProjectName() As String Get Return _projectName End Get Set(value As String) If (_projectName <> value) Then _projectName = value End If End Set End Property Private _projectName As String <DataMember()> _ Public Property WorkOrderStatus() As String Get Return _workOrderStatus End Get Set(value As String) _workOrderStatus = value End Set End Property Private _workOrderStatus As String <DataMember()> _ Public Property WorkOrderSubStatus() As String Get Return _workOrderSubStatus End Get Set(value As String) _workOrderSubStatus = value End Set End Property Private _workOrderSubStatus As String <DataMember()> _ Public Property WorkOrderType() As String Get Return _workOrderType End Get Set(value As String) _workOrderType = value End Set End Property Private _workOrderType As String <DataMember()> _ Public Property WorkOrderSubType() As String Get Return _workOrderSubType End Get Set(value As String) _workOrderSubType = value End Set End Property Private _workOrderSubType As String <DataMember()> _ Public Property WorkOrderPriority() As String Get Return _workOrderPriority End Get Set(value As String) _workOrderPriority = value End Set End Property Private _workOrderPriority As String <DataMember()> _ Public Property RefNumber() As String Get Return _refNumber End Get Set(value As String) _refNumber = value End Set End Property Private _refNumber As String <DataMember()> _ Public Property Request() As String Get Return _request End Get Set(value As String) _request = value End Set End Property Private _request As String End Class #End Region ``` CompanyHeader: ``` Imports System.ComponentModel.DataAnnotations Imports System.Collections.ObjectModel Imports System.Runtime.Serialization Imports System.Data.Services.Common <DataServiceKey("ID")> _ <MetadataTypeAttribute(GetType(CompanyHeader.CompanyHeaderMetadata))> _ Partial Public Class CompanyHeader Inherits DataTransferObjectHeaderBase Friend NotInheritable Class CompanyHeaderMetadata 'Metadata classes are not meant to be instantiated. Private Sub New() MyBase.New() End Sub <DataMember()> _ Public Property Active As Boolean <DataMember()> _ Public Property ID As Integer <DataMember()> _ Public Property Created As DateTime <DataMember()> _ Public Property Creator As String <DataMember()> _ Public Property Modified As DateTime <DataMember()> _ Public Property Modifier As String <DataMember()> _ Public Property Name As String End Class Public Sub New() End Sub Public Sub New(iID As Integer, sName As String, bActive As Boolean, sCreator As String, dtCreated As DateTime, sModifier As String, dtModified As DateTime) ID = iID Name = sName Active = bActive Creator = sCreator Created = dtCreated Modifier = sModifier Modified = dtModified End Sub End Class ``` Unit Test Code: ``` <TestMethod()> _ Public Sub WorkOrderServiceTests_TestConnectivityThruService5() Dim woService As New DatabaseContext Dim woHeaders = New Repository(Of WorkOrderHeader)(woService) Dim woTests = New Repository(Of WorkOrderTest)(woService) Dim coHeaders = New Repository(Of CompanyHeader)(woService) Assert.IsTrue(woHeaders.Count <> 0) End Sub ``` Things I have tried to resolve the issue: 1) Checked database - Both queries return data correctly. select * from vwWorkOrderHeader select * from vwCompanyHeader 2) Deleted WorkOrderHeader from the EDMX then recreated it from database. 3) MOQed out the DBContext to make sure that it isn't the service query doing something funny. This correctly returns the object, so it means that it is something at the context level or below. 4) Stepped through both tests to ensure that they use the same method of building the context - Thy do. 4) Stepped through both tests to ensure that they use the same method of building the repository - Thy do. 5) The only difference is during the following Function of DatabaseContext: ``` Public Overloads Function [Set](Of T As Class)() As System.Data.Entity.IDbSet(Of T) Implements Interfaces.IDatabaseContext.Set Return MyBase.Set(Of T)() End Function ``` The WorkOrderHeader code has the following in the watch for MyBase.Set(Of T)() ``` {System.Data.Entity.DbSet(Of Insight.Model.WorkOrderHeader)} System.Data.Entity.DbSet(Of Insight.Model.WorkOrderHeader) ``` The CompanyHeader code has the following in the watch for MyBase.Set(Of T)() ``` {SELECT [Extent1].[Name] AS [Name], [Extent1].[Active] AS [Active], [Extent1].[Creator] AS [Creator], [Extent1].[Created] AS [Created], [Extent1].[Modifier] AS [Modifier], [Extent1].[Modified] AS [Modified], [Extent1].[ID] AS [ID] FROM (SELECT [vwCompanyHeader].[ID] AS [ID], [vwCompanyHeader].[Name] AS [Name], [vwCompanyHeader].[Active] AS [Active], [vwCompanyHeader].[Creator] AS [Creator], [vwCompanyHeader].[Created] AS [Created], [vwCompanyHeader].[Modifier] AS [Modifier], [vwCompanyHeader].[Modified] AS [Modified] FROM [dbo].[vwCompanyHeader] AS [vwCompanyHeader]) AS [Extent1]} System.Data.Entity.DbSet(Of Insight.Model.CompanyHeader) ``` I am at a complete loss on this one and am entering my 3rd day of working on the same problem. I am hoping that some fresh eyes on the problem might see an error that I have made or point me in a direction of testing the problem that I have not thought of. UPDATE: I removed the service code to ensure it was something in the DBContext. I have isolated the service out of the equation so that only the repositories are being used and they are all using the same DatabaseContext, so it can't be anything related to the connection string. I verified that in the Model Browser under Insight_Model/EntityContainer:Insight_Entities/Entity Sets/WorkOrderHeaders exists and that under Insight_Model/Entity Types/WorkOrderHeader exists. It almost appears as though the DatabaseContext isn't even attempting to query the conceptual model for the entity set.