在必须在 oracle 和 sqlServer 中工作的应用程序中工作。在 SqlServer 中,我们使用“Bit”来存储布尔值和 oracle number(1)。
我们创建了一个代码优先模型,我们发现映射到数据库字段的布尔属性很少。
例如:
public partial class ZPruebaBooleano
{
public int Numero { get; set; }
public bool Booleano { get; set; }
}
映射为:
this.ToTable("ZPRUEBABOOLEANO", schema);
this.HasKey<int>(t => t.Numero);
this.Property(t => t.Numero).HasColumnName("NUMERO");
this.Property(t => t.Booleano).HasColumnName("BOOLEANO");
此外,将 sw 添加到应用程序配置文件中(为简单起见,我们在不使用任何额外 dll 的情况下对其进行了测试):
<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>
我相信提供程序工厂在创建模型时会读取它,因为如果我在文件中映射的任何类型名称中添加无效条目,它会引发异常。
正如我在其他论坛中发现的那样,这应该可以。但现在我不确定是否应该一直工作,包括代码。
当我执行代码时出现此异常(从西班牙语翻译,如有任何错误,请见谅):
从“Booleano”键入“Edm.Boolean[Nullable=False,DefaultValue=]”以键入“PruebaBooleanos.ZPruebaBooleano”与“OracleEFProvider.number[Nullable=False,DefaultValue=,Precision=38,Scale=0]”不兼容
说 Precision=38 很有趣。数据库是 Number(1),我很确定,实际上这是脚本:
CREATE TABLE ZPRUEBABOOLEANO
(
NUMERO NUMBER(15),
BOOLEANO NUMBER(1)
)
另外,我发现有趣的是,即使我没有通知我正在映射的表,我也遇到了这个错误,就像 oracle 提供者甚至没有检查列是否为数字(任何东西)一样。现在是很好的映射,表和模式。
正如我们在这段代码中看到的那样,我已经测试创建一个由布尔值包装的整数属性。
namespace PruebaBooleanos
{
public partial class ZPruebaBooleano
{
public int Numero { get; set; }
public bool Booleano
{
get
{
return iBooleano == 1 ? true : false;
}
set
{
iBooleano = value ? 1 : 0;
}
}
public int iBooleano { get; set; }
}
}
在最后一种情况下,我忽略了布尔值并映射了整数。
这在甲骨文中工作正常。但增加了2个问题:
- 它在 SqlServer 中失败,因为在 sql server 中有点
- 无法使用布尔属性查询实体模型,因为它未映射到数据库。
我可以将 SqlServer 中的位字段更改为数字。
但我想在 sqlserver 和 oracle 中的 number(1) 中保留位。
有人有类似的问题吗?
我愿意接受任何想法,谢谢!!!
力博