使用Entity Framework将布尔属性映射到Oracle数据库。

5
我需要使用实体模型优先的方式将系统连接到Oracle。 我有一个名为“Entity1”的实体模型。“MyBool”是一个布尔属性。 enter image description here 我成功地从模型生成了sql脚本,并在Oracle数据库上运行它。
然后我有这段代码:
static void Main(string[] args)
{
    Model1Container context = new Model1Container();
    Entity1 entity = context.Entity1.FirstOrDefault();
}

这段代码会抛出以下异常:
“指定的架构无效。错误:Model1.msl(8,12) : error 2019: 指定的成员映射无效。在类型 'Model1.Entity1' 的成员 'MyBool' 的 'Edm.Boolean[Nullable=False,DefaultValue=]' 类型与类型 'Model1.Store.Entity1' 中成员 'MyBool' 的 'OracleEFProvider.number[Nullable=False,DefaultValue=,Precision=1,Scale=0]' 不兼容。”
我阅读了很多线程,许多人说要添加:
  <oracle.dataaccess.client>
    <settings>
      <add name="bool" value="edmmapping number(1,0)" />
    </settings>
  </oracle.dataaccess.client>

在配置文件中(在我的情况下是控制台应用程序的app.config文件),但这并没有改变任何东西。事实上,我可以在此参数上设置任何值,错误仍然是完全相同的。看起来这个参数没有被读取。
然后有些人说:将Oracle.DataAccess DLL添加到项目中。我做到了,结果还是一样。
我知道有很多关于这个主题的帖子,但是它们都没有帮助我,而且我不知道还能做什么。 只是提醒一下,我的真实应用程序模型已经在Sql Server上投入生产。

可能是EF EDM Builder Oracle Number(1, 0) -> Int16/Bool的重复问题。 - Danny Varod
我将列类型从bool更改为整数。在entity model class中(我使用了code first),我创建了一个布尔属性,在setter和getter方法中,我将整数属性转换为布尔值(这样我就不必改变其他应用层)。虽然不太美观,但确实有效。 - Thiago
2个回答

4

经过一些研究,我发现将数据库数字(1)映射到.net布尔类型是完全可以的。当然,缺点是2019年的映射错误(或模式验证错误)。如果您想摆脱映射错误,通常不会对解决方案构建造成任何问题的方法是在构建期间关闭模型验证,将“Validate On Build”设置为false。


0
我在我的项目中使用EF6和Oracle.ManagedDataAccess.Client。升级到EF6后,运行时开始出现相同的错误。将以下代码块添加到Web.Config中解决了该错误。
<oracle.manageddataaccess.client>
    <version number="*">
      <edmMappings>
        <edmNumberMapping>
          <add NETType="int16" MinPrecision="1" MaxPrecision="4" DBType="Number"/>
        </edmNumberMapping>
      </edmMappings>
    </version>
  </oracle.manageddataaccess.client>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接