默认情况下,Entity Framework将tinyint映射到byte。
我尝试将生成后的基础类型更改为布尔值,但是出现编译错误
指定的成员映射无效。成员的类型'Edm.Boolean [Nullable = False,DefaultValue =]'......
这可能在4.0?
我不打算将tinyint列用作布尔值。这是由另一个使用hibernate的团队自动完成的,显然这样做是为了兼容mysql。很明显,tinyint的值大于2.我正在寻找一种方法来映射它,以便任何接受1都是假的,或者任何接受0都是真的。要不会对我有用
有没有办法将各种类型的翻译器插入EF?
答案 0 :(得分:5)
在integer types的MSDN页面上,我们看到tinyint
类型表示0到255之间的整数。
bool
仅代表二进制0
或1
。
将默认映射从byte
更改为bool
(如果它甚至可能,根据this page它似乎不是这样)没有意义 - 例如,如何,您会将42
(有效tinyint
)表示为bool
吗?
如果您需要具有bool
类型属性的实体,我建议将其映射到bit
类型的列。
答案 1 :(得分:4)
实际上,数据库中经常使用整数的主要原因是由于许多数据库引擎不允许在位字段上使用索引。大多数数据库引擎都试图在一个内部'内部组合多个位字段。字节到安全空间。因此,位字段实际上不可用于索引..
事实上的标准是0等于false,所有其他值等于true。但是,EF不支持这种映射。最好的方法是使用声明为byte的私有阴影字段,映射到EF。其次,您创建一个别名布尔属性,供您的代码使用。
使用EF映射私有属性需要一些反射代码。
答案 2 :(得分:1)
如果您现有的数据库中有一个您希望表示为C#类的布尔属性的tinyint列,则可以按照以下步骤进行操作:
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。