Проблема в EF, фрагмент сопоставления, нет значения по умолчанию и не допускает значения NULL

Я разрабатываю приложение MVC 3.

У меня есть модель первого взгляда.

У меня есть компания (аннотация). Лид и Клиент наследуются от юридического лица компании.

Когда я попытался проверить модель, она выдала ошибку.

Ошибка 41 Ошибка 3023: Проблема при сопоставлении фрагментов, начинающихся со строки 70: Столбец Companies.Status в таблице Компании должны быть сопоставлены: он не имеет значения по умолчанию и не допускает значения NULL.

Вот отображение таблиц.

введите описание изображения здесь

И вот код EDMX в просмотре HTML.

<?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="Model1.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator">
    <EntityContainer Name="Model1StoreContainer">

        <EntitySet Name="Companies" EntityType="Model1.Store.Companies" store:Type="Tables" Schema="dbo" />

    </EntityContainer>

    <EntityType Name="Companies">
        <Key>
            <PropertyRef Name="Id" />
        </Key>
        <Property Name="Id" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
        <Property Name="Name" Type="nvarchar(max)" Nullable="false" />
        <Property Name="Status" Type="nvarchar(max)" Nullable="false" />
        <Property Name="__Disc__" Type="nvarchar" MaxLength="Max" Nullable="false" />
    </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="Model1" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation">
        <EntityContainer Name="Model1Container" annotation:LazyLoadingEnabled="true">
          <EntitySet Name="Companies" EntityType="Model1.Company" />
          </EntityContainer>
        <EntityType Name="Company" Abstract="true">
          <Key>
            <PropertyRef Name="Id" />
          </Key>
          <Property Type="Int32" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
          <Property Type="String" Name="Name" Nullable="false" />
        </EntityType>
        <EntityType Name="Lead" BaseType="Model1.Company" >
          <Property Type="String" Name="Status" Nullable="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="Model1StoreContainer" CdmEntityContainer="Model1Container">
        <EntitySetMapping Name="Companies">
            <EntityTypeMapping TypeName="IsTypeOf(Model1.Company)">
                <MappingFragment StoreEntitySet="Companies">
                    <ScalarProperty Name="Id" ColumnName="Id" />
                    <ScalarProperty Name="Name" ColumnName="Name" />
                    <Condition ColumnName="__Disc__" Value="Company" />
                </MappingFragment>
            </EntityTypeMapping>
            <EntityTypeMapping TypeName="Model1.Lead">
                <MappingFragment StoreEntitySet="Companies">
                    <ScalarProperty Name="Id" ColumnName="Id" />
                    <ScalarProperty Name="Name" ColumnName="Name" />
                    <ScalarProperty Name="Status" ColumnName="Status" />
                    <Condition ColumnName="__Disc__" Value="Lead" />
                </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="DatabaseGenerationWorkflow" Value="$(VSEFTools)\DBGen\Generate T-SQL Via T4 (TPH).xaml" />
      </DesignerInfoPropertySet>
    </edmx:Options>
    <!-- Diagram content (shape and connector positions) -->
    <edmx:Diagrams>
      <Diagram Name="Model1" >
        <EntityTypeShape EntityType="Model1.Company" Width="1.5" PointX="2.375" PointY="0.875" Height="1.2636116536458335" />
        <EntityTypeShape EntityType="Model1.Lead" Width="1.5" PointX="3.375" PointY="2.625" Height="1.0992643229166665" />
        <InheritanceConnector EntityType="Model1.Lead" >
          <ConnectorPoint PointX="3.125" PointY="2.1386116536458335" />
          <ConnectorPoint PointX="3.125" PointY="2.325" />
          <ConnectorPoint PointX="4.125" PointY="2.325" />
          <ConnectorPoint PointX="4.125" PointY="2.625" />
        </InheritanceConnector>
        </Diagram>
    </edmx:Diagrams>
  </edmx:Designer>
</edmx:Edmx>

В чем проблема?


person user1668543    schedule 02.10.2012    source источник


Ответы (2)


Поместите атрибут DefaultValue в свойство состояния SSDL. Это будет выглядеть так (я использовал пустую строку):

<Property Name="Status" Type="nvarchar(max)" Nullable="false" DefaultValue=""/>

Поскольку базовая сущность является абстрактной, вы не сможете создавать сущности этого типа, поэтому это значение DefaultValue на самом деле не будет использоваться, но оно должно заставить EF перестать жаловаться.

person Pawel    schedule 08.10.2012
comment
Можно ли это сделать где-нибудь в UI / Designer? - person pbarranis; 18.07.2020
comment
Хотя это решило для меня проблему в OP, при запуске кода я обнаружил, что не могу вставить запись в таблицу, поскольку EF пытается поместить в столбец null, несмотря на DefaultValue. Я также пробовал установить значение по умолчанию в дизайнере, но проблема осталась. Кто-нибудь знает решение или просто обязательно, чтобы все столбцы были помечены как допускающие значение NULL? - person pbarranis; 20.07.2020

В вашей модели хранения столбец Companies.Status не допускает значений NULL.

Поскольку для всех сущностей, наследующих от Company, за исключением сущности Lead, свойство Status не будет установлено, вам необходимо либо разрешить значение null в столбце Companies.Status, либо установить значение по умолчанию, которое будет использоваться для других сущностей.

person GTG    schedule 08.10.2012