13

存储的 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)在不接触 Proc 的情况下在场景背后的映射中自动将 0/1 转换为 False/True?

提前致谢!

4

5 回答 5

29

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

select col1, col2, CONVERT(BIT, CASE WHEN col3 IS NULL THEN 0 ELSE 1 END) as colWithBit
FROM table1
于 2015-02-19T21:01:18.537 回答
12

您可以做的是拥有另一个属性来表示布尔表示。用属性装饰它,NotMapped以便 EF 不会考虑将其用于映射。Do 和 If 条件并true /false根据 Other 属性的值返回。

public Class Customer
{

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

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

}
于 2012-08-02T18:14:46.483 回答
6

在您的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));
}

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

于 2019-05-22T10:47:12.170 回答
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);
        }
    }
}
于 2020-06-17T16:31:58.717 回答
-3

采用System.Convert.ToBoolean(int)

于 2012-08-02T18:18:31.020 回答