entity-framework - 必须映射。它没有默认值且不可为空

标签 entity-framework entity-framework-5

我刚刚开始学习 EF。我面临的问题是 TPH。下面的示例来自 apress 的 EF 食谱。表格基本上是这样的:

CREATE TABLE [Chapter2].[Employee](
[EmployeeId] [int] IDENTITY(1,1) NOT NULL,
[EmployeeType] [int] NULL,
[FirstName] [nvarchar](50) NOT NULL,
[LastName] [nvarchar](50) NOT NULL,
[Salary] [decimal](18, 0) NOT NULL,
[Wage] [decimal](18, 0) NOT NULL,
 CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED 
(
    [EmployeeId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

创建表并将其导入 EF 之后。我做了两个实体,一个 FullTimeEmployee 和 HourlyEmployee。我将员工类型下的条件设置为 1(全职)和 2(小时工)。当然,我要从主要 Employee 实体中删除该属性。

<edmx:Mappings>
  <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs">
    <EntityContainerMapping StorageEntityContainer="EFRecipesModel1StoreContainer" CdmEntityContainer="EFRecipesEntities1">
      <EntitySetMapping Name="Employees">
        <EntityTypeMapping TypeName="IsTypeOf(EFRecipesModel1.Employee)">
          <MappingFragment StoreEntitySet="Employee">
            <ScalarProperty Name="EmployeeId" ColumnName="EmployeeId" />
            <ScalarProperty Name="LastName" ColumnName="LastName" />
            <ScalarProperty Name="FirstName" ColumnName="FirstName" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(EFRecipesModel1.FullTimeEmployee)">
          <MappingFragment StoreEntitySet="Employee">
            <ScalarProperty Name="EmployeeId" ColumnName="EmployeeId" />
            <ScalarProperty Name="Salary" ColumnName="Salary" />
            <Condition ColumnName="EmployeeType" Value="1" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(EFRecipesModel1.HourlyEmployee)">
          <MappingFragment StoreEntitySet="Employee">
            <ScalarProperty Name="EmployeeId" ColumnName="EmployeeId" />
            <ScalarProperty Name="Wage" ColumnName="Wage" />
            <Condition ColumnName="EmployeeType" Value="2" />
          </MappingFragment>
        </EntityTypeMapping>
      </EntitySetMapping>
    </EntityContainerMapping>
  </Mapping>
</edmx:Mappings>

我得到的错误是:

错误 3023:从第 51 行列开始的映射片段中出现问题:必须映射表 Employee 中的 Employee.Salary。它没有默认值且不可为空。

我四处阅读并看到一个 suggestino 更新了 SSDL,这在某种程度上对我来说没有意义:

    <edmx:StorageModels>
  <Schema Namespace="EFRecipesModel1.Store" Provider="System.Data.SqlClient" ProviderManifestToken="2012" Alias="Self" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
    <EntityType Name="Employee">
      <Key>
        <PropertyRef Name="EmployeeId" />
      </Key>
      <Property Name="EmployeeId" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
      <Property Name="EmployeeType" Type="int" Nullable ="false" DefaultValue="1"/>
      <Property Name="FirstName" Type="nvarchar" MaxLength="50" Nullable="false" />
      <Property Name="LastName" Type="nvarchar" MaxLength="50" Nullable="false" />
      <Property Name="Salary" Type="decimal" Precision="18" Scale="0" Nullable="false" />
      <Property Name="Wage" Type="decimal" Precision="18" Scale="0" Nullable="false" />
    </EntityType>
    <EntityContainer Name="EFRecipesModel1StoreContainer">
      <EntitySet Name="Employee" EntityType="Self.Employee" Schema="Chapter2" store:Type="Tables" />
    </EntityContainer>
  </Schema>
</edmx:StorageModels>

请注意,我为 EmployeeType 添加了 Nullable 和 Default 值。这仍然不能解决问题。

关于为什么我在正确映射时遇到这样的问题,我能得到一些帮助吗?

最佳答案

对我来说,将 DefaultValue 添加到商店模型中的 SalaryWage 更有意义:

<Property Name="Salary" Type="decimal" Nullable="false" DefaultValue="0"/>
<Property Name="Wage" Type="decimal" Nullable="false" DefaultValue="0"/>

还有概念模型(在 edmx 设计器中)。

将它们作为默认约束添加到数据库中的字段也是有意义的(尽管从数据库生成模型时 EF 不会将这些约束复制到 edmx)。

无论如何,这些字段必须有一个默认值,因为它们在数据库中不可为空,并且没有任何具体实体为这两个字段提供值。

关于entity-framework - 必须映射。它没有默认值且不可为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20725223/

相关文章:

c# - 在EntityFramework中保存多对多

c# - 调用 SaveChanges 时出现奇怪的 DbEntityValidationException

c# - 是否使用存储库模式?需要 ORM? MVC 网络 API REST

c# - SQL : adding migration to an existing database 的 .NET 代码首次迁移

c# - Entity Framework Skip 方法运行速度很慢

c# - 在 LINQ 查询中使用 ToString()?

.net - EF Core linq 和条件包含然后包含问题

azure - "Login failed for user"在 Azure SQL 中为 "The underlying provider failed on Open"

c# - 具有 ComplexType 的 BulkInsert 实体

c# - 将数据库 View 映射到 EF 5.0 Code First w/Migrations