2011-02-23 13 views
2

CRMデータベースから別のCRMデータベースに顧客をコピーするにはどうすればよいですか?C#とエンティティフレームワークを使用して、あるSQL Serverから別のSQL Serverにレコードセットをコピーする

私の要件は、(プロダクション)sql-serverから、顧客を選択して、関連するデータの100%を別の(テスト)SQL Serverにコピーできることです。

私はすでに自分のWebアプリケーションに使用しているエンティティモデルを用意しています。同じものを使用し、すべての顧客情報をエンティティとして読みたいと思います。しかし、私はこれらのエンティティをどのように使用して別のSQLサーバに接続すればよいかわかりません(ターゲットSQLサーバのアドレスを知るためにカスタム設定を使用する予定です)。

アイデア?

+0

元のデータベースのバックアップを作成し、もう一方のデータベースにバックアップを作成してみませんか? – Maciek

+0

@Maciek:私のCRMは40GB以上の生産規模なので、アイディアは疑問です。 – Nauman

+0

ターゲットデータベースとサーバー名もパラメータとして使用するストアドプロシージャではどうでしょうか? SQL Server側(ストアドプロシージャ)でこれを行うことをお勧めします。なぜなら、dbスキーマを変更するとspは失敗するか、もうコンパイルされず、理由を特定するのが容易になるからです。 –

答えて

2

お客様の顧客および関連するすべてのエンティティを転送するエンティティモデルを定義することができます。次に、エンティティモデルを両方のサーバーで使用できるように、テストサーバーでまったく同じDB構造を定義する必要があります。データの一部が既にDBに存在する場合、問題があろう

Customer customer = null; 
using (var context = new MyContext("ProductionConnectionString")) 
{ 
    // You must use Include to load all related data 
    customer = context.Customers.Include("...").Where(...).Single(); 
} 

using (var context= new MyContext("TestConnectionString")) 
{ 
    context.Customers.AddObject(customer); // Inserts everything 
    using (var scope = new TransactionScope()) 
    { 
    context.SaveChanges(); 
    scope.Complete(); 
    } 
} 

基本的なシナリオは、(擬似コード)とすることができます。そのような場合は、最初にテストDBから顧客をロードし、本番の顧客からロードされたデータに手動でデータをマージして、既存のデータが再度挿入されないようにし、テストDBで変更/削除されたデータを更新/削除する必要があります。

+0

ありがとう、あなたが与えた擬似コードは、私がスイッチ接続で新しいコンテキストをインスタンス化するために考えていたものです。また、テスト中の新規顧客としてプロダクションから顧客を追加する予定であるため、ターゲットDBにあるデータの一部について予測しようとする問題は起こりません。もちろん、両方のデータベースのスキーマは同じでなければならないと言いましたが、これを処理するにはデータベースのバージョン管理システムに従ってください。これは私が顧客のコピーを開始する前に確認する予定です。 – Nauman

+0

2つのアプローチの優雅さとパフォーマンスについてもコメントできますか? sprocとC#&EFを使用する場合と同様に?何らかの理由でわからない、私は個人的にC#とEFベースのソリューションは、より多くの制御とエラー処理と回復性を与えるだろうと感じる? – Nauman

関連する問題