实体框架 - 未分配已加载实体的ID

时间:2011-05-17 08:00:34

标签: entity-framework-4

我有以下POCO课程:

public class Person : Entity
    {
        public string FirstName { get; set; }
        public string MiddleName1 { get; set; }
        public string MiddleName2 { get; set; }
        public string LastName { get; set; }
        public byte? DayOfBirth { get; set; }
        public byte? MonthOfBirth { get; set; }
        public Int16? YearOfBirth { get; set; }
        public string MobileNumber { get; set; }
    }

public abstract class Entity
{
    public int Id { get; set; }
}

这是相应的edmx xml:

<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="EntityFramework.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="EntityFrameworkStoreContainer">
          <EntitySet Name="People" EntityType="EntityFramework.Store.People" store:Type="Tables" Schema="dbo" />
        </EntityContainer>
        <EntityType Name="People">
          <Key>
            <PropertyRef Name="Id" />
          </Key>
          <Property Name="Id" Type="int" Nullable="false" />
          <Property Name="FirstName" Type="nvarchar" Nullable="false" MaxLength="50" />
          <Property Name="MiddleName1" Type="nvarchar" MaxLength="50" />
          <Property Name="MiddleName2" Type="nvarchar" MaxLength="50" />
          <Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="50" />
          <Property Name="DayOfBirth" Type="tinyint" />
          <Property Name="MonthOfBirth" Type="tinyint" />
          <Property Name="YearOfBirth" Type="smallint" />
          <Property Name="MobileNumber" Type="varchar" MaxLength="20" />
        </EntityType>
      </Schema>
    </edmx:StorageModels>
    <!-- CSDL content -->
    <edmx:ConceptualModels>
      <Schema Namespace="EntityFramework" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
        <EntityContainer Name="TheCleavesEntities" annotation:LazyLoadingEnabled="true">
          <EntitySet Name="People" EntityType="EntityFramework.Person" />
        </EntityContainer>
        <EntityType Name="Person">
          <Key>
            <PropertyRef Name="Id" />
          </Key>
          <Property Name="Id" Type="Int32" Nullable="false" />
          <Property Name="FirstName" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" />
          <Property Name="MiddleName1" Type="String" MaxLength="50" Unicode="true" FixedLength="false" />
          <Property Name="MiddleName2" Type="String" MaxLength="50" Unicode="true" FixedLength="false" />
          <Property Name="LastName" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" />
          <Property Name="DayOfBirth" Type="Byte" Nullable="true" />
          <Property Name="MonthOfBirth" Type="Byte" Nullable="true" />
          <Property Name="YearOfBirth" Type="Int16" Nullable="true" />
          <Property Name="MobileNumber" Type="String" MaxLength="20" Unicode="false" FixedLength="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="EntityFrameworkStoreContainer" CdmEntityContainer="TheCleavesEntities">
          <EntitySetMapping Name="People"><EntityTypeMapping TypeName="EntityFramework.Person"><MappingFragment StoreEntitySet="People">
            <ScalarProperty Name="Id" ColumnName="Id" />
            <ScalarProperty Name="FirstName" ColumnName="FirstName" />
            <ScalarProperty Name="MiddleName1" ColumnName="MiddleName1" />
            <ScalarProperty Name="MiddleName2" ColumnName="MiddleName2" />
            <ScalarProperty Name="LastName" ColumnName="LastName" />
            <ScalarProperty Name="DayOfBirth" ColumnName="DayOfBirth" />
            <ScalarProperty Name="MonthOfBirth" ColumnName="MonthOfBirth" />
            <ScalarProperty Name="YearOfBirth" ColumnName="YearOfBirth" />
            <ScalarProperty Name="MobileNumber" ColumnName="MobileNumber" />
          </MappingFragment></EntityTypeMapping></EntitySetMapping>
        </EntityContainerMapping>
      </Mapping>
    </edmx:Mappings>
  </edmx:Runtime>
  <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
  <Designer xmlns="http://schemas.microsoft.com/ado/2008/10/edmx">
    <Connection>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
      </DesignerInfoPropertySet>
    </Connection>
    <Options>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="ValidateOnBuild" Value="true" />
        <DesignerProperty Name="EnablePluralization" Value="True" />
        <DesignerProperty Name="IncludeForeignKeysInModel" Value="False" />
      </DesignerInfoPropertySet>
    </Options>
    <!-- Diagram content (shape and connector positions) -->
    <Diagrams>
      <Diagram Name="TheCleaves">
        <EntityTypeShape EntityType="EntityFramework.Person" Width="1.5" PointX="0.75" PointY="0.75" Height="2.7494921874999996" IsExpanded="true" />
      </Diagram>
    </Diagrams>
  </Designer>
</edmx:Edmx>

当我使用代码加载一个实体(目前数据库中只有一行)时:

IEnumerable<Person> people = context.People.Where(x => true);

我发现返回的Person对象的Id属性为0(数据库中为1)。任何人都知道为什么它似乎没有设置?

由于

1 个答案:

答案 0 :(得分:2)

好吧,我最初认为继承没有问题 - 继承会起作用。这很可能是两个问题的结合:

  • Id在数据库中生成,但EF不知道它们。 EDMX的SSDL和CSDL部分都应define Id with StoreGeneratedPattern.Identity。这将强制EF在插入实体时重新加载Id。
  • 我相信您正在使用相同的上下文实例来保存实体并调用查询。现在你遇见identity map pattern。尽管从查询中检索到的数据,EF将使用内部存储在其每个上下文缓存中的实例。由于第一个问题,缓存实例的Id默认int值= 0。