Entity Framework - вставка новой сущности через objectcontext не использует существующие свойства сущности - PullRequest
0 голосов
/ 09 октября 2009

У меня есть метод вставки в моем хранилище, например, так:

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 и проверял, что свойство Name было установлено для объекта, но это не отражается в 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>

Ответы [ 2 ]

2 голосов
/ 10 октября 2009

Вероятно, не связано с этой проблемой, но есть несколько вещей, о которых нужно подумать с EntityFramework

  1. Компиляция зависит от базы данных. Проблемы могут возникнуть, если вы не скомпилируете его для версии базы данных, которую вы планируете использовать (например, SQL Server 2005 vs 2000) - это может вызвать проблемы, если ваша локальная БД 2005, а тестовая или производственная среда 2000.

  2. Небольшое изменение файла edmx, даже такое маленькое, как перемещение объекта в представлении конструктора, приведет к перекомпиляции файлов сопоставления базы данных, и может исправить проблемы, связанные с отображением / и т.д.

2 голосов
/ 10 октября 2009

Ненавижу это говорить, но все, что я делал, было возиться с этим около часа, и теперь это работает. Я не изменил чертовски вещь. Спасибо Microsoft за такую ​​технологию, готовую к производству.

...