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つの問題が追加されました:
- SQLサーバーではビットであるため、SqlServerでは失敗します
- データベースにマップされていないため、boolean プロパティを使用してエンティティ モデルをクエリできません。
SqlServer のビット フィールドを Number に変更できます。
しかし、sqlserver にビットを保持し、oracle に number(1) を保持したいと考えています。
誰かが同様の問題を抱えていましたか?
私はどんなアイデアにもオープンです、ありがとう!!!
リボ