2011-01-13 11 views
5

Tôi có một thực thể EF4 (mã đầu tiên) bao gồm một bitmask int. Tôi đã tạo ra một cấu trúc Bitmask để làm việc với bitmask dễ dàng hơn (cung cấp các thuộc tính bool để truy cập các bit). Cấu trúc bitmask bao gồm các toán tử ngầm bị quá tải để chuyển đổi và từ một int.Sử dụng cấu trúc thay cho nguyên thủy cho loại thuộc tính EF4

Tôi đã thử đặt loại thuộc tính thành cấu trúc bitmask nhưng giá trị sẽ trở lại là 0. Tôi biết giá trị trong cơ sở dữ liệu có giá trị và bitmask hoạt động trong các thử nghiệm đơn vị của tôi. Tôi đặt HasColumnType thành "INT".

Khu nghỉ dưỡng ...

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

Từ đối tượng bối cảnh ...

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

Đây có phải là có thể? Nếu vậy, tôi cần làm gì để nó hoạt động?

Trả lời

3

Bạn không thể ánh xạ trực tiếp cấu trúc của mình. Bạn phải ánh xạ thuộc tính int (thiết lập nội bộ hoặc bảo vệ) và cung cấp thuộc tính thứ hai không được ánh xạ (sử dụng phương thức NotMappedAttribute hoặc Ignore) của loại tùy chỉnh của bạn, trong đó đặt thuộc tính số nguyên được ánh xạ.

+4

Bạn có thể thêm mã ví dụ về cách thực hiện việc này không? – jonas

+0

Bất kỳ tin tức nào về chủ đề này? Tôi có một thuộc tính struct-type đóng gói một int đơn giản. Mọi thứ đã thay đổi kể từ năm 2013? – Shimmy

0

Tôi đã sử dụng thuộc tính được tính struct để truy cập các thuộc tính hoạt động với SQLite trong Entity Framework 6. Trình sửa đổi truy cập được bảo vệ cho thuộc tính ForSQLite không hoạt động đối với tôi. Mặc dù chúng phải được tư nhân hoặc được bảo vệ trong mắt tôi.

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