Jedním se základních kamenů většiny komplexnější webů jsou seed data – jinými slovy základní číselníky. Dnes se podíváme jak jednoduše taková data dostat přímo do databáze z CSV souborů.
Jak na to?
V základu máme dvě možnosti:
- Použijeme jednoduchý způsob čtení CSV souborů a postupného procházení řádků a „ručního“ parsování atributů do objektů
- Použijeme poněkud chytřejší postup, kdy budeme chtít aby na základě hlavičky se jednotlivé řádky samy naparsovaly na jednotlivé atributy objektů – tomuto způsobu se budeme věnovat dále.
Komponenta pro mapování
Existuje hned několik komponent, které poskytují pro .NET možnost mapování CSV sloupců na atributy objektů. My se však podíváme na použití jedné konkrétní a to FileHelperu ve verzi 3.3
Úprava definice třídy
Samotná definice datového objektu může být krapet komplikovanější, než data která chceme z CSV nahrát. Naštěstí však máme poměrně velké množství atributů, které můžeme buďto celé třídě a nebo jednotlivým vlastnostem přiřadit.
Jedním s nejdůležitějším je pak atribut [FieldHidden], který nám říká, že pro import z CSV bude tento prvek ignorován.
Dále se mi hodilo:
- FieldOptional – určuje nepovinný prvek
- FieldConverter – lze definovat specifickou konverzi hodnoty z CSV do třídy
[DelimitedRecord(";"), IgnoreFirst]
[Table("City")]
public class City
{
[Key]
public int Id { get; set; }
[Required]
[StringLength(255)]
public string Name { get; set; }
[FieldOptional]
[FieldConverter(typeof(EmptyStringConverter))]
public string CountryCode { get; set; }
[FieldHidden]
public Country Country { get; set; }
[FieldHidden]
public virtual ICollection<Place> Places { get; set; }
}
Definice importu Seed dat v DbContextu
Jelikož ASP.NET Core od verze 2.1 přidává určitou podporu nahrávání Seed data bude definice velice jednoduchá.
Otevřeme si pouze definici našeho DbContextu a v metodě OnModelCreating přidáme tři řádky:
var engineCity = new FileHelperEngine<City>();
var recordsCity = engineCity.ReadFile(@"Data\City.csv");
builder.Entity<City>().HasData(recordsCity);
Jak můžeme vidět pouze definuje s kterou datovou třídou budeme pracovat, z jakého souboru se data mají načíst a konečně kam se mají uložit.
Import seed data
K samotnému importu data pak dojde až pomocí migrace a její aplikace na databázi.
Do migračního skriptu se nám přidá něco v tomto stylu:
migrationBuilder.InsertData(
table: "City",
columns: new[] { "Id", "CountryCode", "Name" },
values: new object[,]
{
{ 1, "ARM", "Goris" },
{ 46, "PHL", "Parañaque" },
{ 45, "PHL", "Palawan" },
{ 44, "PHL", "Malay" },
....
Add comment