EF中的问题,映射片段,没有默认值,不可为空

时间:2012-10-02 05:25:38

标签: entity-framework entity-framework-4 entity-framework-4.1 entity-relationship

我正在开发MVC 3 Applicaiton。

我有模特第一个approch。

我有公司实体(摘要)。 Lead和Customer继承自公司实体。

当我尝试验证模型时,它给出了错误。

  

错误41错误3023:从行开始映射片段时出现问题   70:Column Companies.Status in table公司必须映射:它有   没有默认值且不可为空。

这是表格的映射。

enter image description here

以下是HTML视图中的EDMX代码。

<?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>

问题是什么?

2 个答案:

答案 0 :(得分:8)

将DefaultValue属性放在SSDL Status属性上。它看起来像这样(我使用空字符串):

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

由于基本实体是抽象的,您将无法创建此类型的实体,因此不会真正使用此DefaultValue,但它应该使EF停止抱怨。

答案 1 :(得分:0)

在您的存储模型中,Companies.Status列不允许空值。

由于除Lead主体之外从Company继承的所有实体都不会设置Status属性,因此您需要在Companies.Status列中允许null或设置用于其他实体的默认值。