2

私は最初にEFコード(v4.4)をORMとして使用し、SqlServerをデータベースとして使用するアプリケーションに取り組んでいます。同様のデータ構造を持つ別のデータベースタイプからデータをインポートするオプションも必要です。データ転送中に、関連データを壊さないように、ID列をそれらが持つ値で転送する必要があります。

これが一連の操作であると仮定します。

  1. データをフェッチする
  2. EFモデルに合うように変換します
  3. 各エンティティをDbContextに追加します
  4. 変更内容を保存

問題は、主キーがID列として設定されているため、ID値がそのまま挿入されないことです。

この問題を解決する方法の1つは、IDENTITY_INSERTコマンドを使用することですが、同じ接続サイクルで挿入クエリと一緒に実行する必要があります。接続サイクルとは、すべての操作(IDENTITY_INSERTおよびINSERT INTO)中に接続を閉じてはならないことを意味します。

問題:ExecuteSqlCommandは、呼び出す前に明示的に開かれていても、接続を閉じます。

この問題の解決策は、このタスクにEFを使用せず、ADO.NETSqlCommandを使用することです。このようにして、接続をいつ開く/閉じるかをより細かく制御できます。

問題:モデルを変更する場合は、インポートクエリも変更する必要があるため、データベース構造を2か所で維持する必要があります。

EFでこれを達成する方法について何かアドバイスはありますか?なぜEFチームがExecuteSqlCommandを呼び出した後、常に接続を閉じることにしたのか、私には少しもわかりません。

4

2 に答える 2

2

EF DbContextを使用するには、次のことを行う必要があります。

  • IObjectContextAdapterを使用して接続を開きます
  • ObjectContextのExecuteStoreCommandを使用して、IDENTITY_INSERTをオン/オフにします
  • DbContextには、データ変換を行うときにPKのDatabaseGeneratedOption.Identityをオフにするスイッチがあるコンストラクターがあります。

パフォーマンスに関しては、私が見つけた最善の方法は、Xレコードのバッチ更新を実行してから、コンテキストを破棄/再作成することです。また、AutoDetectChangesEnabledをfalseに設定します

パフォーマンスに関する興味深い読み物はここにあります:

EntityFrameworkに挿入する最速の方法

于 2012-09-03T10:15:09.533 に答える
1

これを行う正しい方法は、ソースDBとターゲットDBでID値を同一に保つための要件を手放すことだと思います。リレーションをそのままにしてデータをEFモデルにインポートする場合、つまり親オブジェクトを作成してからその子を正しく追加する場合、構造とリレーションは変更されません。

とにかくクエリでID値を使用することは決してないので、それらの値について心配する意味はありません。

他に何もないとしても、これははるかに保守しやすいでしょう。

もう1つのオプションは、PK列を自動生成ではなく、通常の挿入可能な列として作成することです。POCOでは、

<DatabaseGenerated(DatabaseGeneratedOption.None)>

これを達成するための装飾。

于 2012-08-29T05:54:43.473 に答える