VS实体框架中的Oracle实体不会在代码中更新主键
本文关键字:实体 代码 更新 框架 Oracle VS | 更新日期: 2023-09-27 18:08:05
我有一个名为Tree的实体,它有一个名为Id的主键(StoreGeneratedPattern = Identity),当使用以下代码时,它正确地插入到数据库中。
using(TestContainer tss = new TestContainer())
{
Tree tree = new Tree()
{
Name = "TestTree"
};
tss.Trees.AddObject(tree);
tss.SaveChanges();
}
我有一个后备序列+触发器来处理自动增加的主键Id。我已经验证了这实际上正确地插入到数据库中。
调用tss.Refresh(System.Data.Objects.RefreshMode.StoreWins, tree);
不会更新对象('Id'字段仍然为0)。有什么想法吗?
<EntityType Name="Tree">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Type="Int32" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Type="String" Name="Name" Nullable="false" />
<NavigationProperty Name="HeuristicCulls" Relationship="TOPSSSimpleSelect.TreeHeuristicCull" FromRole="Tree" ToRole="HeuristicCull" />
<Property Type="Int32" Name="Type" Nullable="false" />
<NavigationProperty Name="PR_T" Relationship="TOPSSSimpleSelect.PR_TTree" FromRole="Tree" ToRole="PR_T" />
<NavigationProperty Name="TreeItems" Relationship="TOPSSSimpleSelect.TreeTreeItem" FromRole="Tree" ToRole="TreeItem" />
<Property Type="Byte" Name="IsRoot" Nullable="false" />
<Property Type="Byte" Name="IsProductRoot" Nullable="false" />
<NavigationProperty Name="TreeProducts" Relationship="TOPSSSimpleSelect.T_TP" FromRole="Tree" ToRole="TreeProducts" />
</EntityType>
<EntityType Name="TreeItem">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Type="Int32" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<NavigationProperty Name="Questions" Relationship="TOPSSSimpleSelect.TI_Q" FromRole="TreeItem" ToRole="Question" />
<Property Type="String" Name="Name" Nullable="false" />
<NavigationProperty Name="SubmitRules" Relationship="TOPSSSimpleSelect.SubmitRuleTreeItem" FromRole="TreeItem" ToRole="SubmitRule" />
<NavigationProperty Name="PR_TI" Relationship="TOPSSSimpleSelect.PR_TITreeItem" FromRole="TreeItem" ToRole="PR_TI" />
<NavigationProperty Name="Tree" Relationship="TOPSSSimpleSelect.TreeTreeItem" FromRole="TreeItem" ToRole="Tree" />
<Property Type="Int32" Name="TreeId" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Type="Byte" Name="IsRoot" Nullable="false" />
</EntityType>
用XML编辑器打开.edmx文件,查找以以下行开头的部分:
<!-- SSDL content -->
下面应该是一个EntityType标签,其中是数据库表的定义。确保ID列的属性中包含StoreGeneratedPattern="Identity"。
在这个SSDL节下面是一个CSDL节,它看起来很相似,但是定义了代表这个实体的c#对象。视觉设计器似乎只在这个部分填充了StoreGeneratedPatternin,而不是SSDL部分。
EDIT WITH SAMPLE
下面是Employee实体的示例EDMX文件,除了ID、FirstName和LastName属性之外什么都没有。ID是您希望数据库自动生成的字段。注意,有两个不同的地方需要StoreGeneratedPattern。
<?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="Store" Alias="Self" Provider="Oracle.DataAccess.Client" ProviderManifestToken="10g"
xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
<EntityContainer Name="StoreContainer">
<EntitySet Name="EMPLOYEE" EntityType="Store.EMPLOYEE" store:Type="Tables" Schema="TESTSPACE" />
</EntityContainer>
<EntityType Name="EMPLOYEE">
<Key>
<PropertyRef Name="ID" />
</Key>
<!-- The below property requires StoreGeneratedPattern="Identity" -->
<Property Name="ID" Type="number" StoreGeneratedPattern="Identity" Nullable="false" Precision="10" />
<Property Name="FIRST_NAME" Type="varchar2" MaxLength="255" />
<Property Name="LAST_NAME" Type="varchar2" MaxLength="255" />
</EntityType>
</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="Model" Alias="Self"
xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation">
<EntityContainer Name="ModelContainer" annotation:LazyLoadingEnabled="true">
<EntitySet Name="Employees1" EntityType="Model.Employee" />
</EntityContainer>
<EntityType Name="Employee">
<Key>
<PropertyRef Name="ID" />
</Key>
<!-- The below property requires StoreGeneratedPattern="Identity" -->
<Property Type="Int32" Name="ID" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Type="String" Name="FirstName" MaxLength="255" FixedLength="false" Unicode="false" />
<Property Type="String" Name="LastName" MaxLength="255" 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="StoreContainer" CdmEntityContainer="ModelContainer">
<EntitySetMapping Name="Employees1">
<EntityTypeMapping TypeName="Model.Employee">
<MappingFragment StoreEntitySet="EMPLOYEE">
<ScalarProperty Name="LastName" ColumnName="LAST_NAME" />
<ScalarProperty Name="FirstName" ColumnName="FIRST_NAME" />
<ScalarProperty Name="ID" ColumnName="ID" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
</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="True" />
<DesignerProperty Name="IncludeForeignKeysInModel" Value="True" />
</DesignerInfoPropertySet>
</edmx:Options>
<!-- Diagram content (shape and connector positions) -->
<edmx:Diagrams>
<Diagram Name="Model">
<EntityTypeShape EntityType="Model.Employee" Width="1.5" PointX="0.75" PointY="0.75"
Height="1.4279589843749996" />
</Diagram>
</edmx:Diagrams>
</edmx:Designer>
</edmx:Edmx>