私はcsvHelperを使用して.CSVファイルからデータベースを生成しています。 .csvファイルから読み取られるレコードには3つの子クラスがあり、これらの子クラスのいずれかがデータベースに存在する場合と存在しない場合があります。csvHelper動的に子クラスをロードする
私の問題は、csvHelperは存在するすべての子クラスに対して新しいレコードを作成し、代わりにデータベース内の既存のレコードを検索し、存在する場合はこれを使用することです。その結果、子クラステーブルに重複したエントリがたくさん残ってしまいます。
私はユニタリーコンテナを作業単位アプローチで使用しています。ここで
はここpublic class Game {
public Referee Referee { get; set; }
public Team HomeTeam { get; set; }
public Team AwayTeam { get; set; }
}
public class Referee {
public string Name { get; set; }
}
public class Team {
public string Name { get; set; }
}
は、私は通常のような、ストリームリソースとしてCSVを使用してCSVファイルにアクセスし、私のクラスマップ
public sealed class GameMap : CsvClassMap<Game> {
public GameMap() {
References<RefereeMap>(m => m.Referee);
References<HomeTeamMap>(m => m.HomeTeam);
References<AwayTeamMap>(m => m.AwayTeam);
}
}
public sealed class RefereeMap : CsvClassMap<Referee> {
public RefereeMap() {
Map(m => m.Name).Name("RefereeName");
}
}
public sealed class HomeTeamMap : CsvClassMap<Team> {
public HomeTeamMap() {
Map(m => m.Name).Name("TeamName");
}
}
public sealed class AwayTeamMap : CsvClassMap<Team> {
public AwayTeamMap() {
Map(m => m.Name).Name("TeamName");
}
}
である私のコードです:
byte[] byteData = webClient.DownloadData(uriAddress);
Stream byteStream = new MemoryStream(byteData);
TextReader reader = new StreamReader(byteStream);
var csv = new CsvReader(reader);
csv.Configuration.RegisterClassMap<GameMap>();
csv.Configuration.RegisterClassMap<RefereeMap>();
csv.Configuration.RegisterClassMap<HomeTeamMap>();
csv.Configuration.RegisterClassMap<AwayTeamMap>();
var records = new List<Game>();
while (csv.Read())
{
records.Add(csv.GetRecord<Game>());
}
...
CSVファイルの数行は、通常このようになります
Home, Away, Referee
Leeds, Leicester, Steve Dunn
Derby, Everton, Steve Dunn
Leicester, Man United, Andy Hall
Everton, Leicester, Andy Hall
この例では、合計4つのゲームが作成され、8チームが作成され、4人の審判が作成されます。レスター、エバートン、スティーブ・ダン、アンディ・ホールにはすべて重複が含まれています。つまり、レスターの場合は3チーム、アンディ・ホールの場合は2レフリーのオブジェクトです。
私が使用している.CSVファイルはフラット形式であり、各ゲームの行をしています。ホームチーム、アウェイチーム、審判のためのコラムがあります。他の列もありますが、私が求めている質問の目的のために、他の詳細は無関係です。
csvHelperがゲームレコードを読み込むと、1人の新しい審判と2人の新しいチームが作成されます。 300試合を読んだ後、データベースに300人の審判(250+重複)と600個のチーム(550+重複)があります。理想的には、新しいものを作成する前に、審判とチームをデータベースから検索する必要があります。
ゲームごとに2つのチームが存在するため、CSVファイルに各ラインまたはゲームごとに2つの新しいチームオブジェクトが作成されます。
マッピングを使用してこの作業を行う方法は本当にわかりませんが、援助は歓迎されます。
ありがとうございます。
おそらくこれを達成する別の方法はありますか? – Craig
CSVデータサンプルがありますか?それは他の人が試してみるのにとても役立ちます。 – Ian
例を追加しました。これは単なるフラット形式です。 – Craig