12

過去数日間、インターネットで私の質問に似たトピックを探しました。私はついにこの質問を自分自身に尋ねることに頼りました。

コード ファーストの方法論と EF 4.3.1 を使用して、ストアド プロシージャの出力を格納するためのコンテキスト クラス、エンティティ クラス、およびクラスを作成しました。コンテキスト クラスには、 を使用して特定のストアド プロシージャを実行するメソッドがありますSqlQuery<T>

例:

public IEnumerable<Results> GetData(int id)
{
   var parameters = new SqlParameter[] { new SqlParameter("@id", id) };
   var result = this.Database.SqlQuery<Result>("Exec dbo.sproc_GetData @id",    parameters);
   var data= result.ToList<Result>();

   return data;
}

デバッグをトレースしていると、データが戻ってきて、データが一致する名前のプロパティにマップされます。ただし、出力には"/"、名前に が含まれる列があります (例: Info/Data)。明らかに、そのようなプロパティに名前を付けることはできないため、列属性 ( [Column("Info/Data")])を使用して出力をマップできると考えました。

[Column("Info/Data")]
public string InfoData
{
   get { return infoData; }
   set { infoData= value; }
}

逐語演算子 ( [Column(@"Info/Data")]) を使用して、テキストを[]( [Column("[Info/Data]")]) で囲んでみたり、両方 ( [Column(@"[Info/Data]")]) を試したりしました。コードをステップ実行すると、一致する列名を持つプロパティが割り当てられていることがわかりますが、列属性を持つプロパティは無視され、割り当て中にステップオーバーされます。

また、エンティティのすべての列に対して fluent-api を試しました。

    modelBuilder.ComplexType<Result>().Property(d => d.InfoData).HasColumnName("Info/Data");

しかし、それは次の例外をスローします:

データ リーダーは、指定された 'NameSpace.Result' と互換性がありません。タイプ 'InfoData' のメンバーには、データ リーダーに同じ名前の対応する列がありません。

私のプロジェクトNameSpace.Resultではクラス (セキュリティのために名前が変更されています) でInfoDataisあり、fluent-api を使用してマップしようとするプロパティです (対応する sql 列には / が含まれています。例: Info/Data)。

誰かがこの問題に遭遇しましたか?

私の問題が明確でない場合、または以前に質問されたことがある場合は、お知らせください。

4

3 に答える 3

3

これは古い質問だと思いますが、OPの最近の回答によって盛り上がっているため、おそらくまだ関心があります。

そのストアド プロシージャをそのまま使用し続け、EF と互換性のない列名を返す場合、SQL を渡して proc を直接呼び出しているのを見てSqlQuery、INSERT-EXEC メソッドを使用して宣言のようなことを行うことができますか?テーブル変数 (より互換性のある列名を使用)、ストアド プロシージャをテーブル変数に INSERT-EXEC し、テーブル変数から結果セットとして選択しますか?

渡すのは長ったらしいSQLなので、私は好ましい解決策ではありませんが、それが問題を回避する方法であるかどうかを確認するための思考演習として、私はそれを提供すると思いました。

この種の問題に関する優れた記事: http://www.sommarskog.se/share_data.html - ほとんどのメソッドは、ストアド プロシージャを変更できなかったため役に立ちません (したがって、おそらくほとんどまたはまったくアクセスできません)。 db構造を変更するか、まったく変更しますか?)、ただし、INSERT-EXECメソッドは、dbレベルで何も変更する必要なしに可能な回避策としてポップアウトします...

于 2014-06-12T11:49:46.780 に答える
0

ご希望に添えない場合もございます。Raw SQL を使用すると、EF のマッピング部分がバイパスされます。

Entity Framework を使用して、ストアド プロシージャの結果を別の名前のパラメーターを持つエンティティにマップする方法

ExecuteStoreQuery と同じこと http://social.msdn.microsoft.com/Forums/pl/adonetefx/thread/d524b005-12a4-4300-a974-1e0582de876b

ObjectQuery を使用して、DbDataRecord オブジェクトのリストを取得できます。次に、Linq の「選択」関数を使用して、結果をオブジェクト タイプにマップします。IEnumerable を受け取り、IEnumberable を返す拡張関数でそのマッピングをラップするとします。

エンティティ フレームワークからカスタム オブジェクト <List T> を返し、オブジェクト データ ソースに割り当てる

于 2012-04-15T02:39:30.770 に答える