无法将数字(1,0)转换为布尔

时间:2016-09-29 19:34:54

标签: c# oracle entity-framework-6

我正在使用Oracle托管数据访问组件 代码优先

尝试将Int16转换为布尔值 但总是收到异常

  

''属性名称'属于'班级名称'无法设置为   ' System.Int16'值。您必须将此属性设置为非null值   ' System.Boolean'

如果我在我的POCO中有一个布尔值作为属性并使用DbSet的SqlQuery或手动创建一个datareader我收到一个强制转换异常

有趣的是,如果我使用普通的EF,例如

var test = dbContext.Set<Person>().Where(c=> 1==1).ToList();

不会抛出异常并设置预期的属性值。

基本型号

public class Person
{
   [Key]
   public int Id { get; set; }
   public bool Active { get; set; }
}

调用ToList会引发异常

static void Main(string[] args)
{
     var dbContext = new Context();
     var sql = "select 1 Id, cast(1 as Number(1,0)) Active from dual";
     var query = dbContext.Set<Person>().SqlQuery(sql);
     var list = query.ToList();
}

我在配置文件中定义了edmMappings(我认为这不重要),如下所示:

<oracle.manageddataaccess.client>
    <version number="*">
      <edmMappings>
        <edmNumberMapping>

          <add NETType="bool" MinPrecision="1" MaxPrecision="1" DBType="Number" />
          <add NETType="byte" MinPrecision="2" MaxPrecision="3" DBType="Number" />
          <add NETType="int16" MinPrecision="4" MaxPrecision="5" DBType="Number" />
          <add NETType="int32" MinPrecision="6" MaxPrecision="10" DBType="Number" />
          <add NETType="int64" MinPrecision="11" MaxPrecision="19" DBType="Number" />
        </edmNumberMapping>
      </edmMappings>
    </version>
  </oracle.manageddataaccess.client>

我的最终目标是避免修改我的POCO

2 个答案:

答案 0 :(得分:1)

可能您可以按照以下方式声明您的实体类,以实现您的需求

public class Person
{
   [Key]
   public int Id { get; set; }
   public int Active { get; set; }
   [NotMapped]
   public bool IsActive 
   {
       get { return Convert.ToBoolean(Active); }
       set { Active = Convert.ToInt32(value); }
   }
}

希望这有帮助。

答案 1 :(得分:0)

因为在oracle中不存在boolean,你可以在你的班级做类似的事情。

public class Person
{
    [Key]
    public int Id { get; set; }
    public bool Active {
        get { return Convert.ToBoolean(activeNumeric); }
        set { this.activeNumeric = Convert.ToInt32(value); }
    }
    private int activeNumeric { get; set; }
}