在EF 4.x中处理将0/1转换为False / True的最简单方法是什么?

时间:2012-08-02 18:02:21

标签: c# entity-framework-4

存储的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?

提前致谢!

5 个答案:

答案 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)