2011-05-17 106 views
0

我有以下的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); 

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

感谢

+0

是否存在与您的实体类相对应的映射?你是否期望所有的Ids都是全球独一无二或独一无二的类型?即如果您有人员和产品,是否可以有Id为1的产品和Id为1的人员?你想使用继承来共享行为,或者一个接口是否可以完成这项工作? (实体框架使用继承进行事务处理,它不会与接口一起使用) – RichardW1001 2011-05-17 08:15:40

+0

只适用于该类型。我使用继承来共享行为(它在语义上也是合理的 - 实体是特定类的类)。你认为这个Id没有被填充,因为它来自基类吗? – David 2011-05-17 18:22:41

回答

2

确定它是不是继承的问题,因为我最初以为 - 继承会工作。这很可能是两个问题的组合:

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

这是真的吗?我无法相信EF会对我的领域设计决策产生太大的影响。我一直在用NHibernate使用这种模式,而NH甚至没有扬起眉毛。 – David 2011-05-17 18:25:04

+0

当我更改类以便它不扩展实体并直接将Id属性添加到类时,我仍然遇到完全相同的问题。 – David 2011-05-17 18:43:05

+0

您是否使用相同的上下文实例进行保存和加载? – 2011-05-17 18:45:32