【问题标题】:Entity Framework: mapping tinyint to boolean实体框架:将 tinyint 映射到布尔值
【发布时间】:2011-04-30 08:19:47
【问题描述】:

默认情况下,Entity Framework 将 tinyint 映射到字节。

我尝试将底层类型生成为布尔后更改,但出现编译错误

指定的成员映射无效。成员 blah 的类型 'Edm.Boolean[Nullable=False,DefaultValue=]'...

这在 4.0 中可能吗?

使用 tinyint 列作为布尔值不是我的想法。这是由另一个使用hibernate的团队自动完成的,显然这样做是为了与mysql兼容。显然 tinyint 的值比 2 多。我正在寻找一种方法来映射它,以便任何接受 1 的内容都是错误的,或者任何接受 0 的内容都是正确的。要么对我有用

有没有办法将类型转换器插入到 EF 中?

【问题讨论】:

    标签: c# entity-framework mapping


    【解决方案1】:

    如果您现有的数据库有一个 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,并且 null 被解释为 false。

    【讨论】:

    • 这应该是公认的答案。更改数据库中的数据类型并不总是可行的。
    • 添加 [NotMapped] 属性是我的解决方法。我在数据库中设置了一些,但 EF 在尝试将 int 映射到布尔值时出错。
    【解决方案2】:

    从 MSDN 的 integer types 页面中,我们看到 tinyint 类型代表 0 到 255 之间的整数。

    相比之下,bool 仅表示二进制 01

    将默认映射从 byte 更改为 bool(如果可能的话,根据 this page 似乎不是这样)没有意义 - 例如,您将如何表示该值42(有效的tinyint)作为bool

    如果您需要具有bool 类型属性的实体,我建议将其映射到bit 类型的列。

    【讨论】:

    • 同意。我讨厌小整数被用来表示布尔值。显然这是在java中使用hibernate完成的,并且为mysql兼容性创建了作为tinyint的字段..
    • 在旧语言中,除 0 以外的任何值都被视为真,而 0 则被视为假......所以他们应该部分归咎于 :)
    • 恰恰相反,它确实很有意义!如果您根本无法更改数据库架构(无论出于何种原因),那么您别无选择,只能调整映射。除非您想将具有布尔语义的属性公开为整数,否则很难看。
    • 使用 bit 而不是 tinyint 为我解决了这个问题。我们之前在我们的数据上使用 NHibernate,而 tinyint 是从那继承而来的。
    【解决方案3】:

    实际上,在数据库中经常使用整数的主要原因必须是由于许多数据库引擎不允许对位字段进行索引。大多数数据库引擎尝试将多个位字段组合在一个“内部”字节中以安全空间。结果,位字段实际上不能用于索引。..

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 2019-01-12
      • 2011-12-23
      • 2015-08-17
      • 2019-11-13
      • 2010-10-09
      相关资源
      最近更新 更多