我遇到了由我写作的实体框架提供商返回的布尔值问题。 EF期望一个布尔值,而ADO提供者返回一个Int16,因此EF引发一个InvalidOperationException来自物化的System.Int16'输入' System.Boolean'类型无效。 有没有办法定制实体框架的实现过程,使其调用由提供者实现的实现过程?
修改
部分找到解决方案......我无法找到改变实现行为的方法,但我以这种方式更改了DbDataReader行为
public override bool GetBoolean(int ordinal)
{
object booleanObject = GetValue(ordinal);
if (booleanObject == null)
throw new InvalidOperationException("Cannot cast null to boolean");
if (booleanObject.GetType() == typeof(bool))
return _wrappedDataReader.GetBoolean(ordinal);
else if (booleanObject.GetType() == typeof(short))
return ((short)booleanObject) != 0;
else
throw new InvalidOperationException(string.Format("Cannot convert {0} to boolean", booleanObject.GetType()));
}
修改 更多解释......
我正在写EF提供商。
EF(关于从db读取)以这种方式工作:
EF使用表达式树
提供程序返回sql查询
EF运行查询EF实现查询结果
在表达式树中,EF提供程序知道应该是布尔值的返回类型,但是无法在查询中将其转换为布尔值。
将Int16强制转换为布尔值的唯一方法是在实现过程中或在DBDataReader中(插入类似((Int16)值)!= 0)
实际上我解决了它在DbDataReader上编写一个包装器(几个空覆盖和一个覆盖转换)但可能我在实现过程中遗漏了一些东西。