在我的项目中,我正在尝试将Entity Framework 6与SQL Server和MySql一起使用。
现在我在数据库中有一个名为ISENABLED
的列,现在这个列在SQL Server中是bool,在MYSQL中是Char(1)
,理想情况下它应该是MYSQL中的BIT,但由于这是遗留数据库,因此它使用此列的字符。
现在每当我尝试使用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 :(得分: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 Function中动态映射属性。
绑定私有财产的代码是:
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。
它适用于所有三个数据库。