存储的Proc返回一个值为0或1的列,而不转换为BIT。在我的POCO中,如果我将该字段声明为
public bool MyColumn {get; set;}
我收到此错误:
The specified cast from a materialized 'System.Int32' type to the 'System.Boolean' type is not valid.
这实际上是有意义的,因为EF将返回值识别为整数。
我想知道有没有简单的方法(添加注释或使用流畅的api)在场景后面的映射中自动将0/1转换为False / True而不触及Proc?
提前致谢!
答案 0 :(得分:27)
另一个选择是从存储过程返回一个BIT,这样你就不需要在C#端投射任何东西或使用任何奇怪的装饰。这意味着,您可以将整数值转换为T-SQL中的BIT,如下所示:
select col1, col2, CONVERT(BIT, CASE WHEN col3 IS NULL THEN 0 ELSE 1 END) as colWithBit
FROM table1
答案 1 :(得分:12)
你可以做的是让另一个属性来表示布尔表示。使用NotMapped
属性装饰它,以便EF不会将其视为Mapping。 Do和If条件并根据Other属性的值返回true /false
。
public Class Customer
{
[NotMapped]
public bool MyColumnBool
{
get
{
return (MyColumn ==1);
}
}
public int MyColumn {get; set;}
// other properties
}
答案 2 :(得分:0)
在ApplicationDbContext
(继承自DbContext
的类)中,可以使用Fluent Api转换数据库的值。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<TheNameOfYourModelClass>()
.Property(p => p.MyColumn)
.HasConversion(
v => v ? : 1 : 0,
v => (v == 1) ? true : false);
}
现在,当为1
插入true
时,数据库将包含MyColumn
,反之亦然。从数据库中读取时,1
将转换为true
,反之亦然。
答案 3 :(得分:0)
基于@jimmy提供的内容,还可以分别定义ValueConverter,然后将其应用于多个实体/属性:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var boolConverter = new ValueConverter<bool, int>(
v => v ? 1 : 0,
v => (v == 1) ? true : false);
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
foreach (var property in entityType.GetProperties())
{
if (property.ClrType == typeof(bool))
property.SetValueConverter(boolConverter);
}
}
}
答案 4 :(得分:-3)
使用System.Convert.ToBoolean(int)