3

私は既存のSQLServerデータベースを持っており、データベースごとに1つずつ、大きな特定のログファイル(多くの場合100 MB以上)からのデータを保存しています。いくつかの分析の後、データベースは再び削除されます。

データベースから、VisualStudioデザイナーを介してEntityFrameworkモデルとDataSetモデルの両方を作成しました。SqlBulkCopyDataSetは、非常に複雑な解析プロセスの後に、を使用してデータを一括インポートするためだけのものです。次に、すべてのクエリはEntity Framework Modelを使用して実行されます。CreateQueryこのモデルのメソッドは、次のようなインターフェイスを介して公開されます。

    public IQueryable<TTarget> GetResults<TTarget>() where TTarget : EntityObject, new()
    {
        return this.Context.CreateQuery<TTarget>(typeof(TTarget).Name);
    }

さて、時々私のファイルは非常に小さいので、そのような場合はデータベースへのインポートを省略したいのですが、エンティティとしてアクセス可能なデータのメモリ内表現を持っているだけです。アイデアは、DataSetを作成することですが、一括インポートする代わりに、インターフェイスを介してアクセスできるObjectContextに直接転送します。

これは意味がありますか?

これまでにこの変換で行ったことは次のとおりです。DataSet内のすべてのテーブルをトラバースし、単一の行を対応するタイプのエンティティに変換して、タイプされたEntityコンテキストクラスのインスタンス化されたオブジェクトに追加します。

            MyEntities context = new MyEntities(); //create new in-memory context
            ///....
            //get the item in the navigations table
            MyDataSet.NavigationResultRow dataRow = ds.NavigationResult.First(); //here, a foreach would be necessary in a true-world scenario
            NavigationResult entity = new NavigationResult
            {
                Direction = dataRow.Direction,
                ///...
                NavigationResultID = dataRow.NavigationResultID
            }; //convert to entities

            context.AddToNavigationResult(entity); //add to entities
            ///....

エンティティタイプごとにコンバーターを作成し、データセット内の各テーブルを反復処理する必要があるため、非常に面倒な作業です。データベースモデルを変更した場合は注意してください。

MyEntitiesまた、 SQL Serverデータベースに有効な接続文字列を提供した場合にのみ、インスタンス化できることがわかりました。毎回本格的なデータベースに実際に書き込みたくないので、これは私の意図を妨げます。インメモリプロキシデータベースをいくつか持つつもりです。

もっと簡単にできますか?DataSetオブジェクトからObjectContextを生成するなど、このような変換を自動化する方法はありますか?

PS:ユニットテストについて、いくらか関連しているように見えますが、正確ではない質問をいくつか見ました。

4

1 に答える 1

1

automapperなど、オブジェクト間でマッピングするツールがあります。これは非常に優れたオープンソースツールです。

ただし、これらのツールには、重複するエンティティキーの生成などの問題や、マップされるオブジェクトの構造が大きく異なる場合の問題が発生することがあります。

自動化しようとしている場合、EF 4オブジェクトとPOCOオブジェクトを使用すると、機能する可能性が高くなると思います。

マッピングコードを手動で作成することになった場合は、自動化された単体テストを使用して別の手順に移動します。

これを行う方法は、「Map」メソッドを使用して静的クラスを作成することです。

  • DTOからEFオブジェクトへ
  • EFからDTOへ

次に、フィールドが正しくマップされていることを確認する各メソッドのテストを記述します。

于 2010-04-30T15:07:08.413 に答える