代码之家  ›  专栏  ›  技术社区  ›  Sonic Soul

实体框架:将tinyint映射到布尔值

  •  10
  • Sonic Soul  · 技术社区  · 14 年前

    默认情况下,实体框架将tinyint映射到byte。

    我尝试在将基础类型生成为Boolean之后将其更改,但得到了编译错误。

    指定的成员映射无效。成员blah的类型“edm.boolean[nullable=false,defaultvalue=]”…

    这在4.0中是可能的吗?

    使用tinyint列作为布尔值不是我的主意。这是由另一个使用Hibernate的团队自动完成的,显然这是为了MySQL的兼容性。显然,tinyint的值大于2。我正在寻找一种映射方法,使1的任何接受都是错误的,或者0的任何接受都是正确的。两个都适合我

    有没有办法把一个类型转换器插入到ef中?

    3 回复  |  直到 6 年前
        1
  •  5
  •   Donut    14 年前

    从上的msdn页面 integer types 我们看到 tinyint 类型表示从0到255的整数。

    bool 相反,只表示二进制 0 1 .

    更改默认映射 byte 布尔 (如果可能的话,根据 this page 似乎没有)没有意义——例如,您如何表示该值 42 (A有效 提宁 作为一个 布尔 ?

    如果需要具有类型属性的实体 布尔 ,我建议将其映射到类型为的列 bit .

        2
  •  4
  •   Swordfish    10 年前

    实际上,在数据库中经常使用整数的主要原因是因为许多数据库引擎不允许对位字段进行索引。大多数数据库引擎试图将一个“内部”字节中的多个位字段分组为安全空间。因此,位字段不能真正用于索引。

    defacto标准是0等于false,所有其他值等于true。但是,EF不支持这种映射。最好的方法是使用一个声明为字节的私有阴影字段,该字段映射到ef。其次,创建代码使用的别名布尔属性。

    用EF映射私有属性需要一些反射代码。

        3
  •  1
  •   Frank Rem    6 年前

    如果您的现有数据库中有一个tinyint列,您希望将其表示为C类的布尔属性,那么可以按如下方式执行:

    public class Subscription
    {
      public int Id { get; set; }
      public string Name { get; set; }
    
      // the column of your database
      public byte? autoRenew { get; set; }
    
      // the property you want
      [NotMapped]
      public bool Autorenew
      {
        get => autoRenew > 0;
        set { this.autoRenew = (byte)(value ? 1 : 0);  }
      }
    }
    

    显然,这假定0和1分别对应于false和true。在此示例中,autorenew可以为空,而null被解释为false。