2014-10-26 99 views
5

我试图重新写在C#MVC一个VB.NET的WebForms应用程序。使用实体框架实例化类时,我遇到了其中一个属性的问题。实体框架C#转换INT为bool

我在我的数据库“VATInclusive”,其类型为“诠释”有一列。原来的应用程序隐式转换为“1”或“0”到“真”或“假”,而是试图做这在我的应用程序时,我得到以下错误:

The 'VATInclusive' property on 'Shop' could not be set to a 'System.Int32' value. You must set this property to a non-null value of type 'System.Boolean'.

我不能简单地在其他应用程序使用该表时更改数据库中的类型。我试过使用下面的代码来转换值,但它似乎只返回false,无论数据库是否有“0”或“1”......任何人都可以提出解决方案吗?

[Column("VATInclusive")] 
    private int _VATInclusive { get; set; } 

    [NotMapped] 
    public bool VATInclusive 
    { 
     get 
     { 
      if (_VATInclusive == 0) 
      { 
       return false; 
      } 
      else 
      { 
       return true; 
      } 
     } 
     set 
     { 
      if(_VATInclusive == 0) 
      { 
       this.VATInclusive = false; 
      } 
      else 
      { 
       this.VATInclusive = true; 
      } 
     } 
    } 
+0

当你说“我没有任何运气”时,你究竟是什么意思? – furkle 2014-10-26 20:44:31

回答

5

在从提供的答案一些建议,我已经纠正了问题。问题在于setter访问者以及_VATIncusive属性。通过将代码更改为以下内容,我设法让系统按预期工作。

不过,我觉得这是不是最好的方法,但它似乎一切正常......

编辑编辑:我已经减少了get方法进行每建议从瑞安和hvd ..

编辑:我不确定这两个属性设置为公开的影响。但我认为这不会成为一个问题。

[Column("VATInclusive")] 
    public int _VATInclusive { get; set; } 

    [NotMapped] 
    public bool VATInclusive 
    { 
     get 
     { 
      return _VATInclusive != 0; 
     } 
     set 
     { 
      _VATInclusive = value ? 1 : 0; 
     } 
    } 
+0

功能上,这很好。你可以通过说“return Convert.ToBoolean(_VATInclusive);”来将访问器放到一行中。虽然这对我来说很好。 – 2014-10-26 20:59:48

+1

或'get {return _VATInclusive!= 0; }'。只要注意,你只能在自己的代码中使用你的'VATInclusive'属性,它不能被转换为SQL。像'db.Shops.Where(s => s.VATInclusive).ToList()'会编译但在运行时抛出一个异常,你仍然必须把它写成'db.Shops.Where(s = > s._VATInclusive!= 0).ToList()'。 – hvd 2014-10-26 21:11:30

+0

@ hvd我想这不是真的吗?我仍然试图以更优雅的方式重新编写此文,但我认为上述解决方案已经尽可能接近了。 我可能只是调查改变数据库类型会对VB.NET应用程序产生的影响...... – Ant 2014-10-26 21:14:54

1

您的二传手上有一些拼写错误。我想你的意思是它是:

set 
    { 
     if(value == false) 
     { 
      _VATInclusive = 0; 
     } 
     else 
     { 
      _VATInclusive = 1; 
     } 
    } 

基本上,“值”代表您的二传手通过布尔值(在转换为整数)。 _VATInclusive是您想要在引擎盖下进行修改的实际对象。

+0

你的想法可能是对的,但你的细节不是。正如你所说,“价值”是一个“布尔”,所以它不能与零比较。 '_VATInclusive'是一个'int',而不是'bool',所以它不能被赋予'false'或'true'。 – hvd 2014-10-26 21:08:40

0

在你set,你需要比较反对value

if (value == 0) 
1

你不能有一个setter访问分配给自己 - 这总是会导致一个StackOverflowException。在下面的代码中:

set 
{ 
    if(_VATInclusive == 0) 
    { 
     this.VATInclusive = false; 
    } 
    else 
    { 
     this.VATInclusive = true; 
    } 
} 

每次this.VATInclusive被赋值时,控制流将返回到set访问器的开始位置。这显然无法完成。

0

如果将该列存储为一点,实体框架会自动将其作为布尔值查询。