2011-04-05 5 views
0

나는 코드 첫 번째 방법을 사용하여 프로젝트를 작성하려고하고 있는데 다음과 같은 문제엔티티 프레임 워크 4.1 형식 당 하나의 테이블 매핑

public class BaseType 
{ 
    [Key] 
    public int id { get; set; } 
    public string description { get; set; } 
} 
public class Type1 : BaseType 
{ 
    public decimal price { get; set; } 

} 
public class mycontext : DbContext 
{ 
    public DbSet<BaseType> basetypes { get; set; } 
    public DbSet<Type1> type1 { get; set; } 

} 

내가 응용 프로그램을 실행으로 실행하고 나는 객체를 생성 Type1을 사용하고 mycontext.type1.ADD(mytype1object);을 사용하고 유형 1에 대한 테이블이 올바른 필드를 가지고 있지만 부모 테이블 "basetypes"에도 가격 필드가있는 데이터베이스를 살펴보십시오.

필드를 명시 적으로 무시해야합니까?

제안 사항?

답변

1

기본적으로 코드는 먼저 TPH (계층 구조 당 테이블) 상속을 사용합니다. 이것이 의미하는 바는 두 유형 모두 'BaseTypes'라는 단일 테이블에 저장된다는 것입니다. Discriminator라는 추가 필드가 포함되어 있음을 알 수 있습니다. EF는 해당 필드에 값을 저장하여 각 레코드가 어떤 유형인지 지정합니다.

다른 유형의 테이블을 사용하려면 TPT (Table Per Type)에 대한 컨텍스트를 설정해야합니다. 테이블 이름으로 데이터 주석으로 클래스를 꾸밀 수도 있고 모델 바인더를 사용할 수도 있습니다. 아래는 데이터 주석 방법입니다.

[Table("BaseTypes")] 
public class BaseType 
{ 
    [Key] 
    public int id { get; set; } 
    public string description { get; set; } 
} 

[Table("Type1s")] 
public class Type1 : BaseType 
{ 
    public decimal price { get; set; } 

} 
0
나는 당신의 문제를 재현 할 수

- 사실 내가 EF 4.1 BaseTypeType1의 두 요소를 포함하는 BaseTypes 테이블이 생성 년대 DB와 같은 모델을 사용하는 경우 - BaseType 요소와 행 그냥 가격으로 null 값이 있습니다. 따라서 TPT가 아니라 TPH를 사용하고 있습니다. TPT로 전환하려면 클래스 Type1 주석 또는 유창한 API 사용할 수 있습니다 입력 BrokenGlass 및 ckal에 대한

[Table("Type1s")] 
public class Type1 : BaseType 
{ 
    public decimal price { get; set; } 

} 
0

감사합니다. 사용자에게 "표 (이름)"주석과 유창한 API를 묶어두고 모든 단계를 수행 한 후 BaseTypes 및 Type1s에 대한 표로 끝나고 TypeTs의 필드에 대한 필드가 BaseTypes 표에 포함되었습니다.

하지만 나머지 모델의 각 테이블 이름을 테이블 이름으로 만든 후에 모든 것을 시도해 보았습니다.

나는 이것이 우연인지 또는 버그를 발견했는지는 모르지만 모든 것이 현재 작동 중입니다.

빠른 답변을 보내 주셔서 다시 한 번 감사드립니다.

좋음 복원 됨 .... 지금은 !!!

관련 문제