私は最初にEFコード(v4.4)をORMとして使用し、SqlServerをデータベースとして使用するアプリケーションに取り組んでいます。同様のデータ構造を持つ別のデータベースタイプからデータをインポートするオプションも必要です。データ転送中に、関連データを壊さないように、ID列をそれらが持つ値で転送する必要があります。
これが一連の操作であると仮定します。
- データをフェッチする
- EFモデルに合うように変換します
- 各エンティティをDbContextに追加します
- 変更内容を保存
問題は、主キーがID列として設定されているため、ID値がそのまま挿入されないことです。
この問題を解決する方法の1つは、IDENTITY_INSERTコマンドを使用することですが、同じ接続サイクルで挿入クエリと一緒に実行する必要があります。接続サイクルとは、すべての操作(IDENTITY_INSERTおよびINSERT INTO)中に接続を閉じてはならないことを意味します。
問題:ExecuteSqlCommandは、呼び出す前に明示的に開かれていても、接続を閉じます。
この問題の解決策は、このタスクにEFを使用せず、ADO.NETSqlCommandを使用することです。このようにして、接続をいつ開く/閉じるかをより細かく制御できます。
問題:モデルを変更する場合は、インポートクエリも変更する必要があるため、データベース構造を2か所で維持する必要があります。
EFでこれを達成する方法について何かアドバイスはありますか?なぜEFチームがExecuteSqlCommandを呼び出した後、常に接続を閉じることにしたのか、私には少しもわかりません。