使用结构代替EF4属性类型的基元

时间:2011-01-13 01:06:08

标签: .net entity-framework-4 ef4-code-only

我有一个包含int位掩码的EF4实体(代码优先)。我创建了一个Bitmask结构,以便更容易地使用位掩码(提供bool属性来访问位)。位掩码结构包括用于转换为int和从int转换的重载隐式运算符。

我尝试将属性类型设置为位掩码结构但该值又返回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 个答案:

答案 0 :(得分:3)

您无法直接映射结构。您必须映射int属性(make setter internal或protected)并提供自定义类型的第二个非映射属性(使用NotMappedAttributeIgnore方法),该属性在内部设置映射的整数属性。

答案 1 :(得分: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;
        }
    }