3

Oracle および sqlServer で動作する必要があるアプリケーションでの作業。SqlServer では、「ビット」を使用してブール値を格納し、Oracle の数値 (1) に格納しました。

データベース フィールドにマッピングされた bool プロパティがほとんどないため、コード ファースト モデルを作成しました。

例えば:

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」から「PruebaBooleanos.ZPruebaBooleano」へのタイプ「Edm.Boolean[Nullable=False,DefaultValue=]」は、「OracleEFProvider.number[Nullable=False,DefaultValue=,Precision=38,Scale=0]」と互換性がありません

Precision=38 と書かれているのはおかしいです。データベースは Number(1) です。確かに、これはスクリプトです。

CREATE TABLE ZPRUEBABOOLEANO
(
  NUMERO    NUMBER(15),
  BOOLEANO  NUMBER(1)
)

また、オラクル プロバイダーが列が数値であるかどうかをチェックさえしなかった場合のように、マッピングしているテーブルに通知していない場合でも、この間違いがあったことは興味深いと思います。現在、テーブルとスキーマは適切にマッピングされています。

このコードでわかるように、ブール値でラップされた整数プロパティを作成するテストがあります。

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. SQLサーバーではビットであるため、SqlServerでは失敗します
  2. データベースにマップされていないため、boolean プロパティを使用してエンティティ モデルをクエリできません。

SqlServer のビット フィールドを Number に変更できます。

しかし、sqlserver にビットを保持し、oracle に number(1) を保持したいと考えています。

誰かが同様の問題を抱えていましたか?

私はどんなアイデアにもオープンです、ありがとう!!!

リボ

4

1 に答える 1

3

投稿日から判断すると、控えめに言っても、この回答は役に立たないと確信していますが、私のように多くの人がこれを役立つと思うかもしれません.

  1. .Net (ODP/ODAC) 用の Oracle データ プロバイダーは、EF Code Firstをサポートしていません
  2. .config ファイルのマッピング設定は、Code First では考慮されません。つまり、追加する <add name="bool" value="edmmapping number(1,0)" />と、EDMX ファイルがあり、model-first または db-first のいずれかを使用する場合にのみ機能します。
  3. すべての希望が失われるわけではありません。SQL Server と Oracle (およびおそらくより多くの db エンジン) の両方でブール値を使用して POCO クラスを実際に使用するための「回避策」があります。

したがって、私にとっての解決策は非常に単純でした。私はあなたと同じことを達成しようとかなりの時間を費やしました.フォーラムのOracleの誰か(従業員のようです)がサポートされていないと私に言ったとき、私は先に進みました.限目。

だからあなたがしたいことはこれです:

  1. ブール値を格納するinteger列を SQL Server に用意する
  2. number(1,0)同じ目的で Oracle に関するコラムを作成する
  3. モデルに 2 つのプロパティがあります。1 つは実際に DB のフィールドにマップされ、もう 1 つはマップされていないが、マップされた値をブール値にキャストします。

したがって、コードでこれを行います:

[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);
        }
    }
}

そして、両方のデータベースにマップできる int を実際に参照するコードで SomeBoolean にアクセスするだけです。

Enum定数値をマッピングするときにもこのアプローチを使用します。

于 2013-09-18T03:33:56.240 に答える