3

在必须在 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个问题:

  1. 它在 SqlServer 中失败,因为在 sql server 中有点
  2. 无法使用布尔属性查询实体模型,因为它未映射到数据库。

我可以将 SqlServer 中的位字段更改为数字。

但我想在 sqlserver 和 oracle 中的 number(1) 中保留位。

有人有类似的问题吗?

我愿意接受任何想法,谢谢!!!

力博

4

1 回答 1

3

从发布日期来看,我很确定这个答案现在至少对你来说毫无用处,但是像我这样的许多人可能会觉得这很有用。

  1. .Net (ODP/ODAC) 的 Oracle 数据提供程序不支持EF 代码优先
  2. Code First 不会考虑 .config 文件上的映射设置,也就是说,如果您添加 <add name="bool" value="edmmapping number(1,0)" />它,它只会在您拥有 EDMX 文件并且使用模型优先或 db-first 时才有效
  3. 并非所有希望都消失了,对于您的案例(以及我的案例和许多其他案例),有一个“解决方法”可以在 SQL Server 和 Oracle(可能还有更多的数据库引擎)中实际使用带有布尔值的 POCO 类

所以对我来说解决方案很简单,我花了很多时间试图为你完成同样的事情,当论坛上的 Oracle 的某个人(似乎是一名员工)告诉我它不受支持时,我就继续前进了,时期。

所以你想要做的是:

  1. 在 SQL Server 中有一个integer用于存储布尔值的列
  2. 出于同样的目的,在 Oracle 上有一个number(1,0)专栏
  3. 模型中有两个属性,一个实际映射到数据库中的字段,另一个未映射但将映射值转换为布尔值

所以在你的代码中这样做:

[Table("SomeTable")]
public class MyModel  {

    [Column("SOME_BOOLEAN")]
    public int SomeBooleanValue { get; set; }

    [NotMapped]
    public bool SomeBoolean {
        get {
            return Convert.ToBoolean(SomeBooleanValue);
        }
        set {
            SomeBooleanValue = Convert.ToInt32(value);
        }
    }
}

然后你只需在你的代码中访问 SomeBoolean ,它实际上将引用一个可以映射到两个数据库的 int 。

我在映射 Enum 常量值时也使用这种方法。

于 2013-09-18T03:33:56.240 回答