如何解决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 举报,一经查实,本站将立刻删除。