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

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>
0
Brian 9 Окт 2009 в 23:11
Вы рассмотрели возможные проблемы с отображением. Можете ли вы вставить сопоставление xml?
 – 
Michael Gattuso
9 Окт 2009 в 23:17
Обновил мой исходный пост выше с помощью xml
 – 
Brian
9 Окт 2009 в 23:23
Интересно, что я вставил ваш xml и воссоздал ваш код, и у меня это сработало. Пробовали ли вы изолировать ObjectContext (т. е. пытались добавить объект без слоя репозитория). Я также заметил, что у вас c.Name = CLEARANCE. Является ли ЗАЗОР переменной/константой?
 – 
Michael Gattuso
10 Окт 2009 в 01:04
Хех, да, я сделал то же самое. Я изолировал его, и он работал нормально, так что, видимо, это что-то на уровне моего репозитория. Что по-прежнему кажется мне неправильным, учитывая, что объект имеет свойство Name непосредственно перед вызовом Save. И да, ЗАЗОР - это константа.
 – 
Brian
10 Окт 2009 в 02:44

2 ответа

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

2
Brian 10 Окт 2009 в 03:44
Подумать об этом. Я почти уверен, что у меня был такой опыт. Правда, только в dev. У меня было приложение, работающее около месяца без проблем в производстве.
 – 
Michael Gattuso
10 Окт 2009 в 06:09

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

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

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

2
Michael Gattuso 10 Окт 2009 в 17:10