C# 在EF4.x中将0/1转换为False/True的最简单方法是什么?

C# 在EF4.x中将0/1转换为False/True的最简单方法是什么?,c#,entity-framework-4,C#,Entity Framework 4,存储过程返回值为0或1的列,而不转换为位。在我的POCO中,如果我将字段声明为 public bool MyColumn {get; set;} 我得到这个错误: The specified cast from a materialized 'System.Int32' type to the 'System.Boolean' type is not valid. 这实际上是有意义的,因为EF将返回值识别为整数 我想知道是否有任何简单的方法可以添加注释或使用fluent api在场景后面的映

存储过程返回值为0或1的列,而不转换为位。在我的POCO中,如果我将字段声明为

public bool MyColumn {get; set;}
我得到这个错误:

The specified cast from a materialized 'System.Int32' type to the 'System.Boolean' type is not valid.
这实际上是有意义的,因为EF将返回值识别为整数

我想知道是否有任何简单的方法可以添加注释或使用fluent api在场景后面的映射中自动将0/1转换为False/True,而无需触摸程序


提前谢谢

您可以做的是使用另一个属性来表示布尔表示。用非映射属性来装饰它,以便EF不考虑它的映射。执行和If条件,并根据其他属性的值返回true/false

public Class Customer
{

  [NotMapped]
  public bool MyColumnBool 
  {
      get
      {
         return (MyColumn ==1);
      }
  }

  public int MyColumn {get; set;}
  // other properties

}

使用System.Convert.ToBooleanint

另一个选项是从存储过程返回一点,这样就不需要在C端强制转换任何内容或使用任何奇怪的装饰。这意味着您可以在T-SQL中将整数值转换为位,如下所示:

select col1, col2, CONVERT(BIT, CASE WHEN col3 IS NULL THEN 0 ELSE 1 END) as colWithBit
FROM table1
在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));
}

现在,当为MyColumn插入true时,数据库将包含1,反之亦然。从数据库读取时,1将转换为true,反之亦然。

基于@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);
        }
    }
}

你已经提到了。将返回值转换为位。Boo是正确的。如果您没有访问存储过程的权限将列的返回类型更改为bit,则必须将属性的类型更改为int,然后检查是否等于0。我遇到了类似的问题—在存储过程开始时,我定义了一个带有bit类型列的临时表。在返回结果时,我将临时表中的select与另一个查询合并,其中bit列的值刚刚设置为0。我得到了与上面相同的错误,并最终通过使用castbitcolumn作为位来解决它-这就解决了错误,我不需要更改代码来解决这个问题。+1,尽管我会返回MyColumn!=以防万一真相真的不是零。那很容易。只需fork并更新EF源代码即可,当您的pull请求被接受时,EF将自动执行System.Convert.ToBooleanint,同时实现查询结果。据我所知,从SQL server的角度来看,这是最好的选择。