开发者

EF4 POCO (not using T4): Mapping and metadata information could not be found for EntityType

开发者 https://www.devze.com 2022-12-21 06:39 出处:网络
I have a pretty simple console project with an entity model (containing two simple entities), two handmade POCOs and a handmade Context class. The program fires a simple query against the DB and every

I have a pretty simple console project with an entity model (containing two simple entities), two handmade POCOs and a handmade Context class. The program fires a simple query against the DB and everything including LazyLoading works fine.

The problem: As soon as i add another Entity data model (even if i add an empty one), the calls to CreateObjectSet in Ef2PlaygroundModel_3Container throw the following exception:

Unhandled Exception: System.InvalidOperationException: Mapping and metadata information could not be found for EntityType 'EF2_Playground.Driver'.
  at System.Data.Objects.ObjectContext.GetTypeUsage(Type entityCLRType)
  at System.Data.Objects.ObjectContext.GetEntitySetFromContainer(EntityContainer container, Type entityCLRType, String exceptionParameterName)
  at System.Data.Objects.ObjectContext.GetEntitySetForType(Type entityCLRType, String exceptionParameterName)
  at System.Data.Objects.ObjectContext.CreateObjectSet[TEntity]()
  at EF2_Playground.Ef2PlaygroundModel_3Container.get_Drivers() in C:\...\Ef2PlaygroundModel_3Pocos.cs:line 64
  at EF2_Playground.Program.Main(String[] args) in C:\...\Program.cs:line 15

Does anyone have an idea about what is going wrong here?


That is the working project:

Ef2PlaygroundModel_3.edmx:

EF4 POCO (not using T4): Mapping and metadata information could not be found for EntityType

Code Generation Strategy is set to "None"

<?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="Ef2PlaygroundModel_3.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="Ef2PlaygroundModel_3StoreContainer">
          <EntitySet Name="Cars" EntityType="Ef2PlaygroundModel_3.Store.Cars" store:Type="Tables" Schema="dbo"/>
          <EntitySet Name="Drivers" EntityType="Ef2PlaygroundModel_3.Store.Drivers" store:Type="Tables" Schema="dbo"/>
          <EntitySet Name="CarDriver" EntityType="Ef2PlaygroundModel_3.Store.CarDriver" store:Type="Tables" Schema="dbo"/>
          <AssociationSet Name="FK_CarDriver_Car" Association="Ef2PlaygroundModel_3.Store.FK_CarDriver_Car">
            <End Role="Car" EntitySet="Cars"/>
            <End Role="CarDriver" EntitySet="CarDriver"/>
          </AssociationSet>
          <AssociationSet Name="FK_CarDriver_Driver" Association="Ef2PlaygroundModel_3.Store.FK_CarDriver_Driver">
            <End Role="Driver" EntitySet="Drivers"/>
            <End Role="CarDriver" EntitySet="CarDriver"/>
          </AssociationSet>
        </EntityContainer>
        <EntityType Name="Cars">
          <Key>
            <PropertyRef Name="Id"/>
          </Key>
          <Property Name="Id" Type="int" StoreGeneratedPattern="Identity" Nullable="false"/>
          <Property Name="Brand" Type="nvarchar(max)" Nullable="false"/>
          <Property Name="Model" Type="nvarchar(max)" Nullable="false"/>
          <Property Name="ReleaseDate" Type="datetime" Nullable="true"/>
        </EntityType>
        <EntityType Name="Drivers">
          <Key>
            <PropertyRef Name="Id"/>
          </Key>
          <Property Name="Id" Type="int" StoreGeneratedPattern="Identity" Nullable="false"/>
          <Property Name="Name" Type="nvarchar(max)" Nullable="false"/>
        </EntityType>
        <EntityType Name="CarDriver">
          <Key>
            <PropertyRef Name="Cars_Id"/>
            <PropertyRef Name="Drivers_Id"/>
          </Key>
          <Property Name="Cars_Id" Type="int" Nullable="false"/>
          <Property Name="Drivers_Id" Type="int" Nullable="false"/>
        </EntityType>
        <Association Name="FK_CarDriver_Car">
          <End Role="Car" Type="Ef2PlaygroundModel_3.Store.Cars" Multiplicity="1"/>
          <End Role="CarDriver" Type="Ef2PlaygroundModel_3.Store.CarDriver" Multiplicity="*"/>
          <ReferentialConstraint>
            <Principal Role="Car">
              <PropertyRef Name="Id"/>
            </Principal>
            <Dependent Role="CarDriver">
              <PropertyRef Name="Cars_Id"/>
            </Dependent>
          </ReferentialConstraint>
        </Association>
        <Association Name="FK_CarDriver_Driver">
          <End Role="CarDriver" Type="Ef2PlaygroundModel_3.Store.CarDriver" Multiplicity="*"/>
          <End Role="Driver" Type="Ef2PlaygroundModel_3.Store.Drivers" Multiplicity="1"/>
          <ReferentialConstraint>
            <Principal Role="Driver">
              <PropertyRef Name="Id"/>
            </Principal>
            <Dependent Role="CarDriver">
              <PropertyRef Name="Drivers_Id"/>
            </Dependent>
          </ReferentialConstraint>
        </Association>
      </Schema>
    </edmx:StorageModels>
    <!-- CSDL content -->
    <edmx:ConceptualModels>
      <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" Namespace="Ef2PlaygroundModel_3" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation">
        <EntityContainer Name="Ef2PlaygroundModel_3Container" annotation:LazyLoadingEnabled="true">
          <EntitySet Name="Cars" EntityType="Ef2PlaygroundModel_3.Car"/>
          <EntitySet Name="Drivers" EntityType="Ef2PlaygroundModel_3.Driver"/>
          <AssociationSet Name="CarDriver" Association="Ef2PlaygroundModel_3.CarDriver">
            <End Role="Car" EntitySet="Cars"/>
            <End Role="Driver" EntitySet="Drivers"/>
          </AssociationSet>
        </EntityContainer>
        <EntityType Name="Car">
          <Key>
            <PropertyRef Name="Id"/>
          </Key>
          <Property Type="Int32" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity"/>
          <Property Type="String" Name="Brand" Nullable="false"/>
          <Property Type="String" Name="Model" Nullable="false"/>
          <Property Type="DateTime" Name="ReleaseDate" Nullable="true"/>
          <NavigationProperty Name="Drivers" Relationship="Ef2PlaygroundModel_3.CarDriver" FromRole="Car" ToRole="Driver"/>
        </EntityType>
        <EntityType Name="Driver">
          <Key>
            <PropertyRef Name="Id"/>
          </Key>
          <Property Type="Int32" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity"/>
          <Property Type="String" Name="Name" Nullable="false"/>
          <NavigationProperty Name="Cars" Relationship="Ef2PlaygroundModel_3.CarDriver" FromRole="Driver" ToRole="Car"/>
        </EntityType>
        <Association Name="CarDriver">
          <End Type="Ef2PlaygroundModel_3.Car" Role="Car" Multiplicity="*"/>
          <End Type="Ef2PlaygroundModel_3.Driver" Role="Driver" Multiplicity="*"/>
        </Association>
      </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="Ef2PlaygroundModel_3StoreContainer" CdmEntityContainer="Ef2PlaygroundModel_3Container">
          <EntitySetMapping Name="Cars">
            <EntityTypeMapping TypeName="IsTypeOf(Ef2PlaygroundModel_3.Car)">
              <MappingFragment StoreEntitySet="Cars">
                <ScalarProperty Name="Id" ColumnName="Id"/>
                <ScalarProperty Name="Brand" ColumnName="Brand"/>
                <ScalarProperty Name="Model" ColumnName="Model"/>
                <ScalarProperty Name="ReleaseDate" ColumnName="ReleaseDate"/>
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
          <EntitySetMapping Name="Drivers">
            <EntityTypeMapping TypeName="IsTypeOf(Ef2PlaygroundModel_3.Driver)">
              <MappingFragment StoreEntitySet="Drivers">
                <ScalarProperty Name="Id" ColumnName="Id"/>
                <ScalarProperty Name="Name" ColumnName="Name"/>
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
          <AssociationSetMapping Name="CarDriver" TypeName="Ef2PlaygroundModel_3.CarDriver" StoreEntitySet="CarDriver">
            <EndProperty Name="Car">
              <ScalarProperty Name="Id" ColumnName="Cars_Id"/>
            </EndProperty>
            <EndProperty Name="Driver">
              <ScalarProperty Name="Id" ColumnName="Drivers_Id"/>
            </EndProperty>
          </AssociationSetMapping>
        </EntityContainerMapping>
      </Mapping>
    </edmx:Mappings>
  </edmx:Runtime>
  <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
  <edmx:Designer xmlns="http://schemas.microsoft.com/ado/2008/10/edmx">
    <edmx:Connection>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly"/>
      </DesignerInfoPropertySet>
    </edmx:Connection>
    <edmx:Options>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="ValidateOnBuild" Value="true"/>
        <DesignerProperty Name="EnablePluralization" Value="False"/>
        <DesignerProperty Name="CodeGenerationStrategy" Value="None"/>
      </DesignerInfoPropertySet>
    </edmx:Options>
    <!-- Diagram content (shape and connector positions) -->
    <edmx:Diagrams>
      <Diagram Name="Ef2PlaygroundModel_3">
        <EntityTypeShape EntityType="Ef2PlaygroundModel_3.Car" Width="1.5" PointX="3.25" PointY="1.625" Height="1.787985026041667"/>
        <EntityTypeShape EntityType="Ef2PlaygroundModel_3.Driver" Width="1.5" PointX="5.375" PointY="1.625" Height="1.59568359375"/>
        <AssociationConnector Association="Ef2PlaygroundModel_3.CarDriver">
          <ConnectorPoint PointX="4.75" PointY="2.422841796875"/>
          <ConnectorPoint PointX="5.375" PointY="2.422841796875"/>
        </AssociationConnector>
      </Diagram>
    </edmx:Diagrams>
  </edmx:Designer>
</edmx:Edmx>

app.config:

<configuration>
  <connectionStrings>
    <add 
      name="Ef2PlaygroundModel_3Container" 
      connectionString="metadata=res://*/Ef2PlaygroundModel_3.csdl|res://*/Ef2PlaygroundModel_3.ssdl|res://*/Ef2PlaygroundModel_3.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SqlExpress;Initial Catalog=Ef2PlaygroundModel_3;Integrated Security=True;MultipleActiveResultSets=True&quot;" 
      providerName="System.Data.EntityClient" 
    />
  </connectionStrings>
</configuration>

Ef2PlaygroundModel_3Pocos.cs:

using System;
using System.Collections.Generic;
using System.Data.Objects;

namespace EF2_Playground
{
  public class Car
  {
    public Car()
    {
      Drivers = new List<Driver>();
    }

    public int Id { get; set; }
    public string Brand { get; set; }
    public string Model { get; set; }
    public DateTime? ReleaseDate { get; set; }

    public virtual List<Driver> Drivers { get; private set; }
  }

  public class Driver
  {
    public Driver()
    {
      Cars = new List<Car>();
    }

    public int Id { get; set; }
    public string Name { get; set; }

    public virtual List<Car> Cars { get; private set; }
  }

  public class Ef2PlaygroundModel_3Container : ObjectContext
  { 
    public Ef2PlaygroundModel_3Container()
      : base("name=Ef2PlaygroundModel_3Container") 
    {
      ContextOptions.LazyLoadingEnabled = true;
    }

    public IObjectSet<Car> Cars
    {
      get { return CreateObjectSet<Car>(); }
    }

    public IObjectSet<Driver> Drivers
    {
      get { return CreateObjectSet<Driver>(); }
    }
  }
}

Program.cs:

using System;

namespace EF2_Playground
{
  class Program
  {
    static void Main(string[] args)
    {
      using (var ctx = new Ef2PlaygroundModel_3Container())
      {
        foreach (var driver in ctx.Drivers)
        {
          Console.WriteLine(driver.Name);
          foreach (var car in driver.Cars)
          {
            Console.WriteLine("   drives a {0} - {1} (released on {2})", car.Brand, car.Model, car.ReleaseDate);
          }
        }
      }
    }
  }
}

And finally Model1.edmx that breaks the whole thing as soon as i add it to the project:

<?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 xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl" Namespace="Model1.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005">
        <EntityContainer Name="Model1TargetContainer">
        </EntityContainer>
      </Schema>
    </edmx:StorageModels>
    <!-- CSDL content -->
    <edmx:ConceptualModels>
      <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" Namespace="Model1" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation">
        <EntityContainer Name="Model1Container" annotation:LazyLoadingEnabled="true">
        </EntityContainer>
      </Schema>
    </edmx:ConceptualModels>
    <!-- C-S mapping content -->
    <edmx:Mappings>
      <Mapping xmlns="http://schemas.microsoft.com/ado/20开发者_StackOverflow08/09/mapping/cs" Space="C-S">
        <Alias Key="Model" Value="Model1"/>
        <Alias Key="Target" Value="Model1.Store"/>
        <EntityContainerMapping CdmEntityContainer="Model1Container" StorageEntityContainer="Model1TargetContainer">
        </EntityContainerMapping>
      </Mapping>
    </edmx:Mappings>
  </edmx:Runtime>
  <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
  <edmx:Designer xmlns="http://schemas.microsoft.com/ado/2008/10/edmx">
    <edmx:Connection>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly"/>
      </DesignerInfoPropertySet>
    </edmx:Connection>
    <edmx:Options>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="ValidateOnBuild" Value="true"/>
        <DesignerProperty Name="EnablePluralization" Value="False"/>
      </DesignerInfoPropertySet>
    </edmx:Options>
    <!-- Diagram content (shape and connector positions) -->
    <edmx:Diagrams>
      <Diagram Name="Model1"/>
    </edmx:Diagrams>
  </edmx:Designer>
</edmx:Edmx>


Ok, i guess i've got it. I reduced the second model (the one that brakes the project) to the following:

Class1.cs

using System.Data.Objects.DataClasses;
[assembly: EdmSchemaAttribute()]

Bang! The well known exception appears.

As in so many cases, reading the documentation helps:

Mapping POCO entities is not supported if any mapping attributes are applied to custom data classes, including EdmSchemaAttribute at the assembly level.

Sure, i do not literally add mapping attributes to CUSTOM data classes but that doesn't matter for the EdmSchemaAttribute since that one lives on the assembly level.

Adding the second non-POCO model causes code generation resulting in a class that contains (at least) the EdmSchemaAttribute and that is not supported.

What i've learned: Don't mix POCO and non-POCO models in one assembly.


My guess is that ef is lookig at the wrong model. Is there any chance that the models are using the same namespace? You can modify the CSDLs namespace in the property window. What happens if you modify the csdl namespace of the new, empty model?


In the properties of your *.edmx if you are using POCO, then you should set the CodeGenerationStrategy to none.

0

精彩评论

暂无评论...
验证码 换一张
取 消