2014-10-26 116 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

如果將該列存儲爲一點,實體框架會自動將其作爲布爾值查詢。