2011-01-13 3 views
5

int 비트 마스크가 포함 된 EF4 엔티티 (코드 우선)가 있습니다. bitmask 구조체를 만들어 비트 마스크로 작업하기가 더 쉬워졌습니다 (비트에 액세스 할 수있는 bool 속성 제공). 비트 마스크 구조체에는 int로 변환하거나 int에서 변환하기위한 오버로드 된 암시 적 연산자가 포함됩니다.EF4 속성 유형에 대한 기본 구조체 대신 구조체 사용

비트 마스크 구조체에 속성 유형을 설정했지만 값이 0으로 되돌아 왔습니다. 데이터베이스의 값이 값을 갖고 비트 마스크가 단위 테스트에서 작동한다는 것을 알고 있습니다. HasColumnType을 "INT"로 설정합니다.

속성 ... 컨텍스트 객체에서

[Required] 
[Display(Name = "Display Pages Bitmask")] 
[Column(Name = "fDisplayPagesBitmask")] 
public DisplayPagesBitmask DisplayPagesBitmask { get; set; } 

...

protected override void OnModelCreating(ModelBuilder builder) 
{ 
    builder.Entity<Website>() 
     .Property(m => m.DisplayPagesBitmask) 
     .HasColumnType("INT"); 
} 

이 가능합니까? 그렇다면 그것을 작동시키기 위해 무엇을해야합니까?

답변

3

구조를 직접 매핑 할 수 없습니다. int 속성 (내부 setter 또는 내부 protected)을 매핑하고 내부적으로 매핑 된 정수 속성을 설정하는 사용자 정의 유형의 두 번째 매핑되지 않은 속성 (NotMappedAttribute 또는 Ignore 메서드 사용)을 제공해야합니다.

+4

어떻게 수행 할 수 있는지에 대한 예제 코드를 추가 할 수 있습니까? – jonas

+0

이 주제에 대한 뉴스가 있으십니까? 일반 int를 캡슐화하는 struct-type 속성이 있습니다. 2013 년 이후로 변경된 사항이 있습니까? – Shimmy

0

계산 된 속성 struct을 사용하여 Entity Framework 6에서 SQLite와 작동하는 속성을 얻었습니다. ForSQLite 속성에 대해 액세스 수정자가 보호되지 않았습니다. 비록 그들이 개인적으로나 내 눈에 보호되어야합니다.

public Boolean ZystostatikaForSQLite { 
     get; 
     set; 
    } 
    public Boolean ImmunsupressivaForSQLite { 
     get; 
     set; 
    } 
    public Boolean AntikoagolanzienForSQLite { 
     get; 
     set; 
    } 
    public Boolean GlucokortikoideForSQLite { 
     get; 
     set; 
    } 
    // 4 Kategorien der Arzneimittel: Zytostatika, Immunsupressiva, Antikoagolanzien, Glucokortikoide 
    public struct PharmaceuticalCategories { 
     public Boolean Zystostatika; 
     public Boolean Immunsupressiva; 
     public Boolean Antikoagolanzien; 
     public Boolean Glucokortikoide; 
    }; 
    public PharmaceuticalCategories medicineTaken { 
     get { 
      PharmaceuticalCategories pc = new PharmaceuticalCategories(); 
      pc.Zystostatika = this.ZystostatikaForSQLite; 
      pc.Immunsupressiva = this.ImmunsupressivaForSQLite; 
      pc.Antikoagolanzien = this.AntikoagolanzienForSQLite; 
      pc.Glucokortikoide = this.GlucokortikoideForSQLite; 

      return pc; 
     } 
     set { 
      this.ZystostatikaForSQLite = value.Zystostatika; 
      this.ImmunsupressivaForSQLite = value.Immunsupressiva; 
      this.AntikoagolanzienForSQLite = value.Antikoagolanzien; 
      this.GlucokortikoideForSQLite = value.Glucokortikoide; 
     } 
    }