2010-10-25 52 views
8

实体框架将tinyint映射到字节。实体框架:默认情况下,将tinyint映射到布尔值

我试图改变底层类型它被生成到布尔之后,但得到编译错误指定

会员映射无效。类型“Edm.Boolean [可空=假,默认值=”构件嗒嗒...

这可能在4.0?

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

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

回答

3

从MSDN页面上integer types,我们看到tinyint类型代表整数范围从0到255

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

更改默认的映射从bytebool(如果它甚至有可能,它根据this page好像它不是)没有任何意义 - 如何,例如,将你所代表的价值42(有效tinyint )作为bool

如果你需要一个属性类型为bool的实体,我建议将它映射到bit类型的列。

+0

同意。我讨厌使用小整数来表示布尔值。显然这是在java中使用hibernate完成的,并且为mysql兼容性创建了一个tinyint字段。 – 2010-10-25 17:32:36

+3

在早期语言中,除0之外的任何值都被视为true,0被视为false ...因此它们部分归咎于:) – Dismissile 2010-10-25 17:47:58

+3

恰恰相反,它的确有很多的意义!如果你不能改变数据库模式(无论出于什么原因),那么你没有别的选择,只能调整映射。除非你想用布尔型语义将一个属性公开为一个整数,这很丑陋。 – proskor 2013-05-02 10:25:52

4

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

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

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