2017-02-24 55 views
0

在我的項目中,我試圖使用實體框架6與SQL Server和MySql。EF6與SQL Server和MYSQL,在數據庫中有不匹配的數據類型

現在我有一列名爲ISENABLED數據庫,現在這列是SQL Server布爾和MYSQL Char(1),理想情況下應該在MYSQL位,但因爲這是傳統的數據庫,它使用char此列。

現在,無論何時我嘗試從數據庫中使用EF6獲取此表時,我都會成功獲得SQL Server的結果,因爲在代碼中,我有一個爲該數據庫映射的bool屬性,但對於Mysql,它會引發錯誤,表示字符串不能成爲轉換爲布爾。 Singh char在EF6中轉換爲字符串。

這裏是我的代碼:

屬性映射代碼數據庫列:

public bool IsEnabled { get; set; } 

現在我也嘗試了MySQL是:

private string IsCharBasedEnabled { get; set; } 
[NotMapped] 
public bool IsEnabled 
{ 
    get { return IsCharBasedEnabled == "0"; } 
    set { IsCharBasedEnabled = value ? "1" : "0"; } 
} 

我映射IsCharBasedEnabled到數據庫列,MySQL的Char列映射爲字符串,然後轉換爲bool,如上所示。

但是這種解決方案不適用於SQL Server。

我可以擁有一些適用於具有相同屬性的數據庫的東西嗎?

我無法更改我的MySQL數據庫的架構。

我應該在這裏做什麼?

回答

0

好吧,我找到了解決辦法:

與所有的三個數據庫
 private bool IsEnabled1 { get; set; } 

    private string IsCharBasedEnabled { get; set; } 


    [NotMapped] 
    public bool IsEnabled 
    { 
     get { return IsCharBasedEnabled == "True" || IsCharBasedEnabled == "Y" || IsEnabled1; } 
     set { 
      if (value.ToString() == "Y" || value.ToString() == "N") 
      { 
       IsCharBasedEnabled = value ? "Y" : "N"; 
      } 
      else if (value.ToString() == "True" || value.ToString() == "False") 
      { 
       IsCharBasedEnabled = value ? "True" : "False"; 
      } 
      else if(value) 
      { 
       IsEnabled1 = true; 
      } 
     } 
    } 

工作,樓市動態地OnModelCreating功能圖。

代碼結合的私有財產:

modelBuilder.Types().Configure(c => 
      { 
       var properties = c.ClrType.GetProperties(BindingFlags.NonPublic 
                 | BindingFlags.Instance) 
              .Where(p => p.Name == "IsEnabled1"); 
       foreach (var p in properties) 
        c.Property(p).HasColumnName("FeatureEnable").IsRequired(); 
      }); 

所以對於SQL Server綁定IsEnabled1,MySQL和Postgres的綁定ISCHarBasedEnabled。

它對所有三個數據庫都正常工作。