2011-01-13 1 views
5

У меня есть объект EF4 (кодовый код), который включает в себя битовую маску int. Я создал структуру Bitmask, чтобы упростить работу с битмаксами (предоставляет свойства bool для доступа к битам). Структура битмаски включает перегруженные неявные операторы для преобразования в и из 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 (сделать сеттер внутренним или защищенным) и предоставить второе свойство без сопоставления (используйте метод NotMappedAttribute или Ignore) вашего настраиваемого типа, который внутренне устанавливает свойство целочисленного значения.

+4

Не могли бы вы добавить пример кода, как это можно сделать? – jonas

+0

Любые новости на эту тему? У меня есть свойство struct-type, которое инкапсулирует простой int. Что-нибудь изменилось с 2013 года? – Shimmy

0

Я использовал вычисляемое свойство struct, чтобы добраться до свойств, который работает с SQLite в Entity Framework 6. модификатора доступа защищаемого для 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; 
     } 
    } 
Смежные вопросы