在实体框架提供程序中自定义实现过程

时间:2014-11-24 07:59:51

标签: c# entity-framework

我遇到了由我写作的实体框架提供商返回的布尔值问题。 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读取)以这种方式工作:

  1. EF使用表达式树

  2. 调用EF提供程序
  3. 提供程序返回sql查询

  4. EF运行查询EF实现查询结果

  5. 在表达式树中,EF提供程序知道应该是布尔值的返回类型,但是无法在查询中将其转换为布尔值。

    将Int16强制转换为布尔值的唯一方法是在实现过程中或在DBDataReader中(插入类似((Int16)值)!= 0)

    实际上我解决了它在DbDataReader上编写一个包装器(几个空覆盖和一个覆盖转换)但可能我在实现过程中遗漏了一些东西。

0 个答案:

没有答案