在Entity Framework中将模型属性设置为布尔值

18

我刚开始学习实体框架,并没有太多ORM经验。

在我的小应用程序中,我有一个表格,这个SQL Server表格有几列,包括一个PrimaryKey(int),一个Name(string)和一个Flag(tinyint)。

当我把这个表格导入时,它自动将Flags的数据类型分配为字节。这很好,但Flag实际上应该是一个布尔值,所以我

  1. 点击映射详细信息
  2. 选择我的Flag属性
  3. 将类型从Byte更改为Boolean
  4. 重新构建应用程序

然后我得到了这个错误:

Error 2019: Member Mapping specified is not valid. The type 'Edm.Boolean[Nullable=True,DefaultValue=]' of member 'MyFlag' in type 'MyModel.MyItem' is not compatible with 'SqlServer.tinyint[Nullable=True,DefaultValue=]' of member 'MyFlag' in type 'MyModel.Store.MyItem'.

有没有办法让 Flag 成为一个布尔值而不是字节?

MyItem item = new MyItem();
item.Flag = true;
并且在数据库中将Flag保存为1?

你为什么需要那个而不是布尔值? - Jonas Stensved
@JonasStensved 问题在于我使用的数据库表中数据类型不正确。一旦我将表更改为使用“位”而不是“字节”,一切就完美地解决了。 - Nathan Koop
2个回答

19

在数据库中,您可以将MyFlag的数据类型更改为bit


1
谢谢,位(bit)在这种情况下肯定是正确的数据类型。 - Nathan Koop
那如果我正在使用一个视图呢? - Bruno Machado - vargero
@Bruno 如果您正在使用Code First(从数据库映射到模型),则应该像表格一样使用Views。如果您正在使用EDMX,请查看此文章 - onetwopunch
花了很长时间才找到这篇文章来解决问题。DB first MySQL Linq EF6。我将所有的tinyint(1) NOT NULL DEFAULT FALSE更改为BIT(1) NOT NULL DEFAULT b'0',目前一切都很顺利。之前我遇到的错误是"String was not recognized as a valid Boolean."。 - sobelito

3

我认为对于 tinyint,您需要创建一个部分类,并使用一个适当地读取/写入该字段的单独字段。但是,框架将正确地将 bit 字段解释为 boolean

您可以尝试以下代码作为部分类:

public partial class MyItem
{
    public bool FlagBool
    {
        get { return Flag == 1; }
        set { Flag = value ? 1 : 0; }
    }
}

谢谢,你说得完全正确,我应该使用位(bit)。 - Nathan Koop
没问题,之前经历过。 - Quintin Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接