2013-12-22 2 views
3

EF를 배우기 시작했습니다. 내가 직면하고있는 문제는 TPH입니다. 아래의 예는 EF의 조리법에 의한 것입니다. 테이블은 기본적으로 다음과 같습니다.반드시 매핑해야합니다. 기본값이 없으며 null이 아닙니다.

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에 대해서는 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> 

내가지고있어 오류는 다음과 같습니다

Error3023 : 테이블 직원에 Employee.Salary 매핑해야합니다 라인 (51) 열에서 시작 조각을 maaping에 문제가 있습니다. 기본값이 없으며 Null을 허용하지 않습니다.

나는 주위를 읽고있는 방법으로 나에게 이해가되지 않았다 suggestino까지 업데이트 SSDL 보았다 : 나는 EmployeeType에 대한 null 허용 및 기본 값을 추가

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

메모를. 이것은 여전히 ​​문제를 해결하지 못합니다.

내가 왜 그런 문제가 제대로 매핑되어 있는지에 대한 도움을 얻을 수 있습니까?

답변

2

는 나에게 그것은 가게 모델에서 SalaryWage에의 DefaultValue를 추가 할 수 더 의미 :

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

또한 개념적 모델에서합니다 (edmx 디자이너에서).

데이터베이스의 필드에 기본 제약 조건으로 추가하는 것이 좋습니다. EF는 모델을 데이터베이스에서 생성 할 때 이러한 제약 조건을 edmx에 복사하지 않지만이 제약 조건을 데이터베이스의 필드에 추가하는 것이 좋습니다.

아무튼 필드는 데이터베이스에서 Nullable이 아니므로 기본값이 있어야하며 구체적인 엔터티 중 어느 것도 두 필드의 값을 제공하지 않습니다.

+0

고맙습니다. 저는 일종의 급여와 임금을 데이터베이스에서 NULL로 설정함으로써이를 해결했습니다. –

+0

예. 내 마음 속에서 이것을 끓여 본 후에는 일반적으로 TPH를 사용하는 것이 가장 좋은 방법이라고 생각합니다. –

0

나는 비슷한 문제에 부딪쳤다.

"주"엔터티를 마우스 오른쪽 단추로 클릭하고 속성을 선택하십시오. "Main"엔티티를 추상으로 표시 한 Abstract 속성을 true로 설정하십시오.

그냥 나를 위해 기본값을 설정하는 것으로 ef가 불평을 멈추었지만 내 프로그램에서 필요할 때 값을 사용할 수 없다고 생각했습니다.

관련 문제