用一个结构体代替EF4属性类型中的原始类型

8

我有一个EF4实体(Code-First),其中包括一个整数位掩码。我创建了一个位掩码结构体,以使处理位掩码更加容易(提供访问位的布尔属性)。位掩码结构体包括重载的隐式操作符,用于转换为和从整数中转换。

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

4

你不能直接映射你的结构。你需要映射整数属性(使setter成为internal或protected),并提供第二个不被映射的自定义类型属性(使用NotMappedAttributeIgnore方法),该属性在内部设置映射的整数属性。


2
有关这个主题有任何消息吗?我有一个封装了普通整数的结构体类型属性。自2013年以来有什么变化吗? - Shimmy Weitzhandler
是的,我也在寻找如何从类转换为结构体的方法。 - Seabizkit

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接