Используйте структуру вместо примитива для типа свойства EF4 - PullRequest
6 голосов
/ 13 января 2011

У меня есть объект EF4 (сначала код), который включает битовую маску int. Я создал структуру Bitmask, чтобы упростить работу с битовыми масками (предоставляет свойства bool для доступа к битам). Структура битовой маски включает перегруженные неявные операторы для преобразования в и из целого числа.

Я попытался установить тип свойства в структуру битовой маски, но значение возвращается как 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");
}

Возможно ли это? Если это так, что мне нужно сделать, чтобы заставить его работать?

Ответы [ 2 ]

3 голосов
/ 13 января 2011

Вы не можете отобразить вашу структуру напрямую.Вы должны отобразить свойство int (сделать установщик внутренним или защищенным) и предоставить второе не сопоставленное свойство (используйте метод NotMappedAttribute или Ignore) вашего пользовательского типа, который внутренне устанавливает свойство сопоставленного целого числа.

0 голосов
/ 08 марта 2016

Я использовал вычисляемое свойство 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;
        }
    }
...