【问题标题】:EF6 with SQL Server and MYSQL, with mismatch datatype in databaseEF6 与 SQL Server 和 MYSQL,数据库中的数据类型不匹配
【发布时间】:2017-02-24 15:57:27
【问题描述】:

在我的项目中,我尝试将 Entity Framework 6 与 SQL Server 和 MySql 一起使用。

现在我在数据库中有一个名为 ISENABLED 的列,现在此列在 SQL Server 中为 bool,在 MYSQL 中为 Char(1),理想情况下它在 MYSQL 中应为 BIT,但由于这是旧数据库,因此此列使用 Char .

现在,每当我尝试使用 EF6 从 DB 中获取此表时,在 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 数据库的架构。

我应该在这里做什么?

【问题讨论】:

    标签: c# mysql sql-server entity-framework-6 linq-to-entities


    【解决方案1】:

    好的,我找到了解决方案:

         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。

    这三个数据库都运行良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      相关资源
      最近更新 更多