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

Son*_*oul 10 c# mapping entity-framework

默认情况下,Entity Framework将tinyint映射到byte.

我尝试将生成后的基础类型更改为布尔值,但是出现编译错误

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

这可能在4.0?

我不打算将tinyint列用作布尔值.这是由另一个使用hibernate的团队自动完成的,显然这样做是为了兼容mysql.很明显,tinyint的值大于2.我正在寻找一种方法来映射它,以便任何接受1都是假的,或者任何接受0都是真的.要不会对我有用

有没有办法将各种类型的翻译器插入EF?

Fra*_*Rem 7

如果您现有的数据库有一个 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);  }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这应该是公认的答案。更改数据库中的数据类型并不总是可行。 (3认同)

Don*_*nut 5

从MSDN的整数类型页面,我们看到该tinyint类型表示一个0到255之间的整数.

bool相反,A 仅表示二进制01.

将默认映射更改bytebool(如果它甚至可能,根据此页面看起来似乎不是这样)没有意义 - 例如,您将如何将值42(有效tinyint)表示为bool

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

  • 恰恰相反,它确实很有意义!如果您根本无法更改数据库架构(无论出于何种原因),那么除了调整映射之外别无选择.除非你想用布尔语义作为整数公开一个属性,这是丑陋的. (5认同)
  • 在较旧的语言中,除0以外的任何值都被视为true,0被视为false ...因此它们被部分归咎于:) (3认同)

小智 5

实际上,在数据库中经常使用整数的主要原因是许多数据库引擎不允许在位字段上建立索引。大多数数据库引擎尝试将多个位字段分组到一个“内部”字节中以确保安全空间。因此,位字段实际上无法用于索引。

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

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