【问题标题】:Use a struct in place of a primitive for a EF4 property type使用结构代替 EF4 属性类型的原语
【发布时间】:2011-06-08 05:31:15
【问题描述】:

我有一个包含 int 位掩码的 EF4 实体(代码优先)。我创建了一个 Bitmask 结构,以便更轻松地使用位掩码(提供 bool 属性来访问位)。位掩码结构包括重载的隐式运算符,用于与 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");
}

这可能吗?如果是这样,我需要做什么才能让它工作?

【问题讨论】:

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


    【解决方案1】:

    您不能直接映射您的结构。您必须映射 int 属性(使 setter 成为内部或受保护的)并提供您的自定义类型的第二个非映射属性(使用 NotMappedAttributeIgnore 方法),它在内部设置映射的整数属性。

    【讨论】:

    • 有关于这个主题的消息吗?我有一个封装普通 int 的结构类型属性。自 2013 年以来有什么变化吗?
    • 是的,也在寻找你如何从类到结构
    【解决方案2】:

    我使用计算属性 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;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 2016-03-29
      相关资源
      最近更新 更多