微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle的Beta EF Provider-为什么不让我将Decimal映射到“数字”字段

如何解决Oracle的Beta EF Provider-为什么不让我将Decimal映射到“数字”字段

| 所以...我下载并安装了他们的EF提供程序的Oracle Beta版...为什么?因为没有别的方法看起来效果很好(我在CodePlex上尝试过一个,在MSDN上尝试过一个),而我的公司不会为市售的产品(如devart的产品)付费。 因此,效果很好。我能够看到oracle数据库,选择我感兴趣的特定模式,输入表定义。大! 现在我得到一个错误。似乎提供程序的认行为是将number(1,0)字段映射到.NET中的布尔类型。不好,但是,我应该可以更改它,对吧?我得到的错误是“类型不匹配”的错误。因此,我将该字段的定义更改为Decimal(1,0)。 现在,我得到的新错误是十进制(1,0)与数字(1,0)不兼容。而且我被困住了。我无法更改任何有效的映射。 我不喜欢从一开始就使用Oracle,因为它们似乎在支持任何与.NET相关的功能方面落后了几年。现在,我准备完全放弃他们。 所以,我的问题是……除了使我可以使Oracle与EF一起使用的devart组件之外,还有其他方法吗?如果可以的话,它将使我的生活更简单。如果没有,那么我要手工编码所有这些优点...或者告诉合作伙伴切换到sql Server,因为它同样好(因为他们在做什么)。     

解决方法

        这听起来像beta1。默认情况下,beta 1将数字(1,0)映射为布尔值,所有其他数字类型映射为十进制。 Beta 2现在已经发布,应该可以解决这两个问题。 Beta 2使您可以选择将Number(1,0)映射到什么,并且还支持在使用数字(X,0)时映射到更合理的东西,例如int和long。完整的信息在自述文件中,但简短的版本是获得所需功能的最快方法是安装beta 2,然后删除并重新创建模型。 (您可以对其进行更新,但是由于发生了很多更改,因此它相对Beta 1来说有点麻烦,听起来您距离还很远。) 根据我对Beta 2的经验,它应该比Beta 1更经常地获得正确的类型。因此,您不应有太多改变。     ,        尝试在XML编辑器中打开模型,在模型的SSDL部分中将属性类型更改为精度为2的数字,在模型的CSDL部分中将属性类型更改为精度为2的十进制。     ,几天后,在我的上一个项目中,我为EF4开发了Oracle 11g和ODAC beta vresion。我遇到了很多有关其使用的问题,例如无法访问任何函数,使用存储过程非常简单,直到不从中返回任何值,然后您必须使用RefCusrose。在视图中,您必须提供主键,而您说的是将number(1,0)字段映射到Boolean,并且大多数字段以十进制格式映射。 我发现Oracle论坛在oracle形式上非常有用,人们在引用它时给出了三个建议来解决它。 1.在.Config文件中设置替代项 在ODAC EF Beta 2中,默认情况下,Number(1、0)将映射到Edm.Int16。您可以在app.config或web.config中指定将Number(1,0)映射到Edm.Boolean。 以下信息适用于即将推出的Beta 2: Oracle NUMBER(p,0)类型的默认映射可以基于 可以在app.config,web.config或 machine.config。 例如,默认情况下,NUMBER(1,0)映射到Int16。但是,用户可能 想要将NUMBER(1,0)映射到.NET Bool或.NET字节类型。可以做到 通过配置文件。 以下是包含自定义映射的app.config示例,其中 NUMBER(1,0)映射到Bool,NUMBER(3,0)映射到Byte,并且 Int16,Int32,Int64的最大精度从更改为4,9,18 默认值分别为5、10、19:
 <?xml version=\"1.0\" encoding=\"utf-8\"?>
 <configuration>
 <connectionStrings>
 </connectionStrings>
 <oracle.dataaccess.client>
 <settings>
 <add name=\"bool\" value=\"edmmapping number(1,0)\" />
 <add name=\"byte\" value=\"edmmapping number(3,0)\" />
 <add name=\"int16\" value=\"edmmapping number(4,0)\" />
 <add name=\"int32\" value=\"edmmapping number(9,0)\" />
 <add name=\"int64\" value=\"edmmapping number(18,0)\" />
 </settings>
 </oracle.dataaccess.client>
 </configuration>
2.静态类进行转换:
 namespace convert{
static class boolConvert
 {

  public static bool boolchar(char ON)
  {
    switch (ON)
    {
      case \'O\':
      return true;
      case \'N\':
      return false;
      default:
      return true;
    }
  }

  public static char charbool(bool ON)
  {
   switch (ON)
   {
    case true:
    return \'O\';
    case false:
    return \'N\';
    default:
    return \'O\';
   }
  }

}
}
那么您可以在需要时使用它进行转换:        bool isSomthing = convert.boolConvert.boolchar(\'N \');        char isSomthigEelse = convert.boolConvert.charbool(true); 3.使用属性如果您使用的是POCO 如果您使用的是一种生成POCO的代码生成器,则可以在部分类中添加属性。如果您有一个名为\“ MyField \”的字段,则在部分类中添加如下内容:
 public bool MyField_Boolean
 {
 get
 {
  return MyField == \'O\';
 }
 }
您将无法在EF Linq查询中使用MyField_Boolean(因为它不是数据库属性),但是在代码的其他任何地方都可以使用它来获取布尔版本。 尽管我尚未测试其中的任何一个,但也许它将解决您的问题。我希望下一个ODAC版本不会出现这些问题。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。