2

毎晩 3 つの異なるリモート XML ファイルをインポートする必要がある Web アプリケーションがあります。これらのファイルには、学生と保護者の情報、学習情報などが含まれています。

XML を (http 経由で) 読み取り、すべての学生をループして、他の XML ファイルから情報を追加し、関係をデータベースに保存する方法を教えてもらえますか?

次のようなサンプル コードが必要です。

  • 親 XML を開いて読み取り、XML ファイルからの固定 ID を使用してデータベースに保存します
  • 生徒の XML を開いて読み取り、データベースに保存し、親 XML の親 ID を使用してそれぞれの親にリンクします
  • また、すべての生徒の学習情報を保存します

私は自分の戦略がどうなるかを知る必要があります。Entity Framework を使用してこれを達成するための最もスマートで効率的な方法は何でしょうか?

4

2 に答える 2

0

最初にちょっとしたアドバイス..

更新されたファイルを自動的にフェッチしないため、webapp のみを使用している場合は注意が必要です。少なくともすぐに使えるものではありません。Web アプリケーションは、長期間使用されていない場合、IIS によってアンロードされ、ほとんどの場合 "リアクティブ" アプリケーションです。

しかし... 毎晩特定の時間に Web ページを開いてインポートを開始するタスクをスケジュールすることは可能です。

System.Net.HttpWebRequest を使用して、次のように xml をローカルの一時フォルダーにフェッチできます。

HttpWebRequest req = WebRequest.Create("http://url.to/file.xml") as HttpWebRequest;

// check if the cast went well
if (req != null) {
    try {
        HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
        System.IO.FileStream outFileStream =  
            System.IO.File.Create(@"Path\To\localfile.xml");

        resp.GetResponseStream().CopyTo(outFileStream);

        outFileStream.Close();
        outFileStream.Dispose();
    }
    catch (ExceptionTypeA ex1) { 
        // Catch all specific exceptions... ommitted here for brevity 
    }
}

その後、XDocument / XElement ( Linq to Xml ) を使用して Xml ファイルからデータを抽出し、標準の ADO.NET API を使用して DB インポートを作成および処理できます。

(リレーショナル) データベースにインポートした後でのみ、エンティティ フレームワークを完全に使用してデータの取得/変更を行うことができます。すべての xml データを構造化された POCO 型のコレクションに変換し、エンティティ フレームワークを使用してこれらのコレクションにクエリを実行することもできるかもしれませんが、正直なところ、それが最善の方法だとは思いません。

于 2012-10-30T15:13:15.023 に答える
0

Entity Framework を XML ファイルで直接使用する方法がわかりません。EF は、リレーショナル データベースで動作するように設計されています。

何らかの方法でデータをリレーショナル データベースにインポートする必要があると思います。

SQL Server を使用している場合は、 DataSetSqlBulkCopyを使用して、このようなインポートを実行できます (Web サーバーでスケジュールされたタスクを使用して XML ファイルを既にダウンロードしている場合) 。

// Create DataSet and load data
DataSet ParentData = new DataSet();
ParentData.ReadXml(Server.MapPath("ParentFile.xml"));

// Create SqlBulkCopy object
SqlConnection connection = new SqlConnection("YourConnectionString");
SqlBulkCopy bulkCopy = new SqlBulkCopy(connection);
bulkCopy.DestinationTableName = "YourParentTable";

// Get DataTable and copy it to database
DataTable ParentTable = ParentData.Tables["Parent"];
bulkCopy.WriteToServer(ParentTable);
于 2012-10-30T15:13:23.470 に答える