2016-07-29 14 views
4

SQL内には、バイナリ(8)として主キーを持つテーブルがあります。私はUpdate Model from Databaseを使用して、私のモデルにそのテーブルを追加すると、私はこのコラムは私がbyte[]としてその列を取得BinaryEntityFrameworkデータベースの最初の型マッピング - SQLからC#のintへのバイナリ(8)のマッピング#

enter image description here

とC#で=入力していることがわかります。

その列をintにマップできますか?

は、私はSQLでCASTでビューを作成することができます知っている:

SELECT 
    Client_Id, 
    CAST(Client_Id AS INT) AS NewClient_Id, 
    * /*other columns*/ 
FROM 
    dbo.Clients 

が、私は、書くだけでそのテーブルから読み取られないことができなければならないので、これは、解決策ではありません。私は挿入のためのストアドプロシージャを作成することができますが、私はそれを避けたいと思います。

私はEntityFramewor 6.1.3を使用しています。あなたは私の経験では、データベースの構造やページ

+0

また、クォートをパイントポットに入れようとしていますか? 'binary(8)'には8バイトが入っています。 C#の 'int'は4バイトを含んでいます。あなたはここに問題が見えますか? –

+0

@Damien_The_Unbeliever申し訳ありませんが、私は何か間違った記述をしましたが、私はそれを働かせようとしています。私はSQLで 'CAST'をやることができれば、おそらくEFが私のためにそのキャストを行うことができると思った。私は 'byte []'をコードで自分自身でintに変換することができますが、EFにはこのビルドがあると思っていました。それを有効にする方法や設定する方法がわかりません。 – Misiu

+0

ビューに書き込むことができます。しかし、値を元に戻すためには、ビューに対してトリガーを提供する必要があります。またバイナリ8は長いIIRCです。 – Mark

答えて

0

私が知っているマッピングプロセスは、既存のマップを更新する場合は特に、混同するのはとても簡単です。このような理由から、私はあなたが読み取りと書き込みの

Rec.ClientId = BitConverter.GetBytes(CurrentClientId) 

long CurrentClientId = BitConverter.ToInt64(Rec.ClientId) 

を使用することをお勧めしたいです。内部構造に読み込まれたレコードをマッサージするためのラッパーをすでに用意しているかもしれませんが、これはもう一つのステップに過ぎません。

これはバイト配列にあると思われるバイトオーダーには関心がありませんが、少なくともプロセスは正しく往復します。

0

のC#コードの両方にintまたはバイトのどちらかに固執しない理由

0

次のようにあなたは、あなたのモデル内部で変換を処理することができます

[NotMapped] 
    public long ClientId 
    { 
     get { return BitConverter.ToInt64(this.ClientIdBytes, 0); } 
     set { this.ClientIdBytes = BitConverter.GetBytes(value); } 
    } 

    [Column("ClientId")] 
    public byte[] ClientIdBytes { get; set; } 

呼び出し側が長いとしてのclientIdを持つ機能しますが、このプロパティは、データベースにマップされていません。 getterとsetterは、値をClientIdデータベースの列名で保持されている2番目のプロパティに変換するだけです。

+0

これはデータベースの最初のアプローチで動作しますか? – Misiu

+0

これは唯一の方法ですが、ClientIdフィールド(つまり、context.MyTable.Where(e => e.ClientId == 1))を使用してLINQをエンティティクエリに書き込むことはできません。 – bubi

+0

あなたの提案をありがとうございますが、私は全体を読み込まないようにしたいと思います。(つまり、e => e.ClientId == 1))条件を適用するよりもすべてのテーブルを読み込む必要があります(context.MyTable.ToList()テーブルをメモリに入れよう – Misiu

2

あなたは3種類のソリューションに

Xストアドプロシージャを持っていますが、それらを望んでいません。

xマップされていないプロパティをクラスに追加します。このソリューションの最大の問題は、マップされていないプロパティを使用してクエリを作成できないことです。すべてのデータをクライアントに読み込んで、クライアント上のマップされていないプロパティに条件を適用する必要があります(アプリケーションがスケーラブルでないように)。

[NotMapped] 
public long LongClientId 
{ 
    get { return BitConverter.ToInt64(this.ClientId, 0); } 
    set { this.ClientId = BitConverter.GetBytes(value); } 
} 

このクエリは、このようにあなたがそれを変更する必要が

context.MyDbSet.Where(m => m.LongClientId == 12).ToList(); 

を動作しません

context.MyDbSet.ToList().Where(m => m.LongClientId == 12); 

このクエリの結果は、すべてのテーブルのレコードをロードすることである(からの転送あなたのアプリケーションにdbmsを)あなたが必要なものを取るよりリストに追加します。

xビュー(おそらくインデックス付きビュー)を作成し、INSTEAD OFトリガーを使用します。

+0

GitHubのEFリポジトリで問題を作成しました。なぜなら、EF6とEFコアでは現在入手できないものがあるからです。テーブル全体をメモリにロードしたくないので(おそらく、 'ToList'はそうしています)、私はおそらく3番目の解決策を選択します。ストアドプロシージャは同じことをするので、ビューは今のところ最良の解決策のように見えます。私はこれを開いたままにしておきます。もっと良い解決策があるかもしれません。 – Misiu

関連する問題