我正在使用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
答案 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; }
}