3

私には挑戦があります。もともとVB6で使用するように設計されたデータベースがあり、ほとんどの機能はストアドプロシージャにあります。古いアプリケーションがしばらく動作する必要があるため、ストアド プロシージャを変更することはできません。また、短時間でも変更できる独自のデータベースのコピーがないためです。

では、EF からストアド プロシージャを実行し、その結果を POCO の配列/コレクションに書き込むことを最善の方法で行うことは可能ですか?

データベースの最初のアプローチとインポートを試みましたが、ストアド プロシージャは列を返さないため、複雑な型を作成できないと EF は言います。これが機能するようにストアド プロシージャを変更する方法があることがわかりましたが、使用しているデータベースを変更することはできません。

別の課題は、結果の列の名前が「最終変更日」のようなもの、つまりスペースが含まれていることです。EF はこれらをどのようにマッピングしようとしますか? DataLastChanged または Data_last_changed になりますか? POCO を属性でマークして、それらがどのようにマッピングされているかを示す方法はありますか?

私が望んでいたのは次のようなものです

var resuls = efContext.ExecuteStoredProcedure<MyPOCOType>("spName",param1, param2, ...);

そして、EFに結果を型に一致させるのが最善です。そのようなものは存在しますか?ちなみに私たちはEF4を使用していますが、5も利用できると思います。

4

2 に答える 2

2

私は自分で問題の一部を解決したと思います。次のスニペットは、私が必要とすることを行います。

using (DbContext context = new DbContext("DBConnectionStringNameFromAppConfig"))
            {

                SqlParameter[] parameters =
                      {
                                        new SqlParameter("@OwnerID", DBNull.Value),
                                        new SqlParameter("@ExternalColorID", colorOwner.ExternalColorID),
                                        new SqlParameter("@ProductionSiteID", DBNull.Value),
                                        new SqlParameter("@PanelstatusNr", DBNull.Value),
                                        new SqlParameter("@DateLastChecked", DBNull.Value),
                                        new SqlParameter("@rowcount", DBNull.Value),
                      };
                var colors = context.Database.SqlQuery<Models.ColorSelectEvaluation>("[dbo].[sp_Color_Select_Evaluation] @OwnerID, @ExternalColorID, @ProductionSiteID, @PanelstatusNr, @DateLastChecked, @rowcount", parameters).ToList();

            }

これが紛らわしいのは、依然として列の命名です。それらはほとんど機能しているように見えますが、EF は結果の列「評価が必要」をオブジェクトのプロパティ NeedsEvaluation にマッピングしていません。

于 2013-01-31T08:10:42.153 に答える
0

列名が一致していないことについて。stackoverflow に関する別の Q&A は、これをうまく処理しています。 DbSet<T>.SqlQuery からエンティティをマッピングするときに DbModelBuilder 構成が無視されるのはなぜですか?

要約すると、MS はそれが素晴らしいと考えていますが、この方法での名前のマッピングはサポートしていません。唯一の解決策は、ストアド プロシージャを変更することです。これは、まだそれを使用しているレガシー アプリケーションを壊してしまうため、私には選択肢がありません。

于 2013-01-31T08:57:56.723 に答える