2009-10-09 34 views
0

我有一個插入方法在我的倉庫就像這樣:實體框架 - 通過ObjectContext的插入新的實體不利用現有的實體屬性

public T Insert(T entity) 
{ 
    _ctx.AddObject(EntityName, entity); 
    _ctx.SaveChanges(); 
    return entity; 
} 

如果我執行下面的代碼,分配給我的實體的值並不傳播到執行的SQL。

Category c = new Category(); 
c.Name = CLEARANCE; 
c = categoryManager.Insert(c); 

的SQL應該像

INSERT INTO Category(Name) VALUES('Clearance') 

相反,下面的SQL正在執行

insert [dbo].[Category]([Name]) 
values (null) 
select [Id] 
from [dbo].[Category] 
where @@ROWCOUNT > 0 and [Id] = scope_identity() 

我調試的代碼一直到AddObject方法,並驗證了名稱屬性是在實體上設置的,但它並不反映在SQL中。

你能看到我在做什麼錯嗎?


更新與XML映射

<?xml version="1.0" encoding="utf-8"?> 
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx"> 
    <!-- EF Runtime content --> 
    <edmx:Runtime> 
    <!-- SSDL content --> 
    <edmx:StorageModels> 
     <Schema Namespace="ProductCatalogModel.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/2006/04/edm/ssdl"> 
     <EntityContainer Name="ProductCatalogModelStoreContainer"> 
      <EntitySet Name="Category" EntityType="ProductCatalogModel.Store.Category" store:Type="Tables" Schema="dbo" /> 
      <EntitySet Name="Product" EntityType="ProductCatalogModel.Store.Product" store:Type="Tables" Schema="dbo" /> 
      <AssociationSet Name="FK_Product_Category" Association="ProductCatalogModel.Store.FK_Product_Category"> 
      <End Role="Category" EntitySet="Category" /> 
      <End Role="Product" EntitySet="Product" /> 
      </AssociationSet> 
     </EntityContainer> 
     <EntityType Name="Category"> 
      <Key> 
      <PropertyRef Name="Id" /> 
      </Key> 
      <Property Name="Id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /> 
      <Property Name="Name" Type="varchar" Nullable="false" MaxLength="50" /> 
     </EntityType> 
     <EntityType Name="Product"> 
      <Key> 
      <PropertyRef Name="Id" /> 
      </Key> 
      <Property Name="Id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /> 
      <Property Name="Name" Type="varchar" Nullable="false" MaxLength="50" /> 
      <Property Name="CategoryId" Type="int" Nullable="false" /> 
     </EntityType> 
     <Association Name="FK_Product_Category"> 
      <End Role="Category" Type="ProductCatalogModel.Store.Category" Multiplicity="1" /> 
      <End Role="Product" Type="ProductCatalogModel.Store.Product" Multiplicity="*" /> 
      <ReferentialConstraint> 
      <Principal Role="Category"> 
       <PropertyRef Name="Id" /> 
      </Principal> 
      <Dependent Role="Product"> 
       <PropertyRef Name="CategoryId" /> 
      </Dependent> 
      </ReferentialConstraint> 
     </Association> 
     </Schema> 
    </edmx:StorageModels> 
    <!-- CSDL content --> 
    <edmx:ConceptualModels> 
     <Schema Namespace="ProductCatalogModel" Alias="Self" xmlns="http://schemas.microsoft.com/ado/2006/04/edm"> 
     <EntityContainer Name="ProductCatalogEntities"> 
      <EntitySet Name="Category" EntityType="ProductCatalogModel.Category" /> 
      <EntitySet Name="Product" EntityType="ProductCatalogModel.Product" /> 
      <AssociationSet Name="FK_Product_Category" Association="ProductCatalogModel.FK_Product_Category"> 
      <End Role="Category" EntitySet="Category" /> 
      <End Role="Product" EntitySet="Product" /> 
      </AssociationSet> 
      </EntityContainer> 
     <EntityType Name="Category"> 
      <Key> 
      <PropertyRef Name="Id" /> 
      </Key> 
      <Property Name="Id" Type="Int32" Nullable="false" /> 
      <Property Name="Name" Type="String" Nullable="false" MaxLength="50" Unicode="false" FixedLength="false" /> 
      <NavigationProperty Name="Product" Relationship="ProductCatalogModel.FK_Product_Category" FromRole="Category" ToRole="Product" /> 
     </EntityType> 
     <EntityType Name="Product" Abstract="false"> 
      <Key> 
      <PropertyRef Name="Id" /> 
      </Key> 
      <Property Name="Id" Type="Int32" Nullable="false" /> 
      <Property Name="Name" Type="String" Nullable="false" MaxLength="50" Unicode="false" FixedLength="false" /> 
      <NavigationProperty Name="Category" Relationship="ProductCatalogModel.FK_Product_Category" FromRole="Product" ToRole="Category" /> 
     </EntityType> 
     <Association Name="FK_Product_Category"> 
      <End Role="Category" Type="ProductCatalogModel.Category" Multiplicity="1" /> 
      <End Role="Product" Type="ProductCatalogModel.Product" Multiplicity="*" /> 
     </Association> 
     </Schema> 
    </edmx:ConceptualModels> 
    <!-- C-S mapping content --> 
    <edmx:Mappings> 
     <Mapping Space="C-S" xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS"> 
     <EntityContainerMapping StorageEntityContainer="ProductCatalogModelStoreContainer" CdmEntityContainer="ProductCatalogEntities"> 
      <EntitySetMapping Name="Category"> 
      <EntityTypeMapping TypeName="IsTypeOf(ProductCatalogModel.Category)"> 
       <MappingFragment StoreEntitySet="Category"> 
       <ScalarProperty Name="Id" ColumnName="Id" /> 
       <ScalarProperty Name="Name" ColumnName="Name" /> 
       </MappingFragment> 
      </EntityTypeMapping> 
      </EntitySetMapping> 
      <EntitySetMapping Name="Product"> 
      <EntityTypeMapping TypeName="IsTypeOf(ProductCatalogModel.Product)"> 
       <MappingFragment StoreEntitySet="Product"> 
       <ScalarProperty Name="Id" ColumnName="Id" /> 
       <ScalarProperty Name="Name" ColumnName="Name" /> 
       </MappingFragment> 
      </EntityTypeMapping> 
      </EntitySetMapping> 
      <AssociationSetMapping Name="FK_Product_Category" TypeName="ProductCatalogModel.FK_Product_Category" StoreEntitySet="Product"> 
      <EndProperty Name="Category"> 
       <ScalarProperty Name="Id" ColumnName="CategoryId" /> 
      </EndProperty> 
      <EndProperty Name="Product"> 
       <ScalarProperty Name="Id" ColumnName="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/2007/06/edmx"> 
    <edmx:Connection> 
     <DesignerInfoPropertySet> 
     <DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" /> 
     </DesignerInfoPropertySet> 
    </edmx:Connection> 
    <edmx:Options> 
     <DesignerInfoPropertySet> 
     <DesignerProperty Name="ValidateOnBuild" Value="true" /> 
     </DesignerInfoPropertySet> 
    </edmx:Options> 
    <!-- Diagram content (shape and connector positions) --> 
    <edmx:Diagrams> 
     <Diagram Name="Model"> 
     <EntityTypeShape EntityType="ProductCatalogModel.Category" Width="1.5" PointX="0.75" PointY="0.875" Height="1.427958984375" IsExpanded="true" /> 
     <EntityTypeShape EntityType="ProductCatalogModel.Product" Width="1.5" PointX="3" PointY="0.875" Height="1.427958984375" IsExpanded="true" /> 
     <AssociationConnector Association="ProductCatalogModel.FK_Product_Category" ManuallyRouted="false"> 
      <ConnectorPoint PointX="2.25" PointY="1.5889794921875" /> 
      <ConnectorPoint PointX="3" PointY="1.5889794921875" /></AssociationConnector> 
     </Diagram></edmx:Diagrams> 
    </edmx:Designer> 
</edmx:Edmx> 
+0

你看過可能的映射問題嗎?你可以粘貼映射XML嗎? – 2009-10-09 19:17:00

+0

用xml – Brian 2009-10-09 19:23:06

+0

更新了我上面的原始帖子有趣的是,我粘貼了你的xml並重新創建了你的代碼,它對我來說工作得很好。你是否嘗試過隔離ObjectContext(即嘗試添加沒有Repository層的對象)。 我也注意到你有c.Name = CLEARANCE。 CLEARANCE是一個變量/常量嗎? – 2009-10-09 21:04:39

回答

2

我討厭這樣說,但我所做的就是惹它大約一個小時,現在它的工作原理。我沒有改變一件怪事。感謝微軟提供這樣的生產就緒技術。

+0

來想一想。我很確定我有這個經歷。只有在開發中。我有一個應用程序運行了大約一個月沒有生產問題。 – 2009-10-10 02:09:27

2

可能不涉及這個問題,但一對夫婦的事情要考慮,用的EntityFramework

  1. 彙編是特定的數據庫。如果您沒有針對您計劃使用的數據庫版本(例如,SQL Server 2005 vs 2000)進行編譯,可能會出現問題 - 如果您的本地數據庫爲2005,而測試或生產環境爲2000,則可能會導致問題。

  2. 製作一個小改動,EDMX文件,甚至一些小的設計視圖中移動的實體會導致數據庫映射文件重新編譯和可以與映射可能修復問題/等