Kami mempersembahkan perhatian Anda DbTool - utilitas baris perintah untuk mengekspor data basis data ke berbagai format dan pustaka sumber terbuka Korzh.DbUtils , yang penggunaannya dapat sangat menyederhanakan "penaburan" awal database dalam aplikasi .NET (Core) Anda.
Dengan toolkit ini, Anda dapat:
- Simpan data dari database lokal Anda ke file format teks tertentu (XML, JSON), yang mudah disambungkan ke proyek.
- Gunakan file yang disimpan untuk mengisi basis data aplikasi itu sendiri pada awal pertama.
Di bawah ini saya akan memberi tahu Anda mengapa semua ini diperlukan, cara menginstal dan mengkonfigurasi alat-alat ini dan menjelaskan skenario terperinci untuk penggunaannya.

Tugas awal adalah membuat mekanisme pengisian basis data yang nyaman dalam aplikasi .NET (Core). Karena kekhasan jenis aktivitas kami (pengembangan komponen), kami sering kali harus membuat aplikasi sampel kecil yang memperagakan satu atau beberapa fitur produk kami. Proyek demo semacam itu harus bekerja dengan database uji tertentu dan oleh karena itu disarankan untuk secara otomatis membuat dan mengisi basis data ini pada awal aplikasi.
Jika proyek menggunakan Entity Framework (Core) (dan itu paling sering terjadi), maka tidak ada masalah dengan membuat database. Anda cukup memanggil dbContext.Database.EnsureCreated
atau dbContext.Database.Migrate
(jika penting untuk menjaga migrasi).
Tetapi dengan mengisi database, semuanya menjadi sedikit lebih rumit. Hal pertama yang terlintas dalam pikiran adalah membuat skrip SQL dengan sekelompok INSERT, memasukkannya ke dalam proyek dan menjalankannya pada awal pertama. Ini bekerja (dan kami lakukan untuk waktu yang lama), tetapi ada beberapa masalah dengan pendekatan ini. Pertama-tama, masalah sintaks SQL untuk DBMS tertentu. Cukup sering, DBMS asli berbeda dari yang benar-benar digunakan oleh pengguna dan skrip SQL kami mungkin tidak berfungsi.
Masalah kedua yang mungkin adalah migrasi dari database itu sendiri. Dari waktu ke waktu, ada kebutuhan untuk sedikit mengubah struktur basis data (menambahkan bidang baru, menghapus atau mengganti nama yang lama, menambahkan hubungan baru antara tabel, dll.). Skrip SQL yang dibuat di bawah struktur lama biasanya menjadi tidak relevan dalam kasus ini dan pelaksanaannya menyebabkan kesalahan. Sementara memuat data dari beberapa format pihak ketiga berjalan tanpa masalah. Kolom baru / yang diubah hanya dilewati. Setuju bahwa untuk tujuan demonstrasi, lebih baik program dimulai, meskipun tanpa data di beberapa bidang baru, daripada tidak dimulai sama sekali.
Akibatnya, kami sampai pada solusi berikut:
- Data dari "master copy" dari database demo kami direkam dalam file dalam format "independen" tertentu (saat ini adalah XML atau JSON). File yang dihasilkan (atau satu file arsip) dikirimkan bersama proyek. Tugas ini, pada kenyataannya, berkaitan dengan DbTool.
- Sepotong kecil kode dimasukkan ke dalam program kami, yang, menggunakan kelas dan fungsi perpustakaan Korzh.DbUtils, mengisi database dengan data dari file yang diperoleh pada langkah pertama.
Selain skenario di atas, DbTool dapat digunakan hanya untuk mengekspor data ke format lain dan untuk mentransfer data antar database. Jadi, misalnya, Anda dapat mengunggah data dari database Anda ke SQL Server dan kemudian memuatnya ke database serupa di MySQL
Instalasi
DbTool diimplementasikan sebagai alat global .NET Core yaitu dapat dengan mudah diinstal pada sistem apa pun di mana ada .NET SDK versi 2.1 atau lebih tinggi.
Untuk menginstal utilitas, Anda hanya perlu membuka konsol (Terminal / Command Prompt) dan jalankan perintah berikut:
dotnet tool install -g Korzh.DbTool
Untuk memeriksa setelah instalasi, ketik dbtool
di konsol dan Anda akan melihat bantuan dengan daftar perintah yang tersedia.

Tambahkan koneksi ke database
Untuk mulai bekerja dengan DbTool, Anda perlu menambahkan koneksi database:
dbtool add {YourConnectionId} {DbType} {YourConnectionString}
Di sini:
- {YourConnectionId} adalah pengidentifikasi yang ingin Anda tetapkan untuk koneksi ini sehingga Anda dapat mengaksesnya nanti ketika Anda menjalankan perintah lain.
- DbType adalah jenis DBMS Anda. Pada saat penulisan ini, DbTool (versi 1.1.7) mendukung database SQL Server (mssql) dan MySQL (mysql).
- Parameter terakhir dalam perintah ini adalah string koneksi. Hal yang sama yang sudah Anda gunakan dalam proyek .NET (Core) Anda.
Contoh:

Setelah itu, Anda dapat memeriksa semua koneksi Anda dengan mengetik:
dbtool connections list
Ekspor data
Sekarang kita telah menambahkan koneksi, kita dapat mengekspor basis data kita menggunakan perintah ekspor:
dbtool export {ConnectionId} [--format=xml|json] [--output={path-to-folder}] [--zip={file-name}]
Opsi apa pun yang disebutkan di atas dapat dihilangkan. Jika Anda tidak menentukan format
maka JSON akan digunakan. Jika Anda menghilangkan opsi output
, hasilnya akan ditempatkan di direktori dari bentuk ConnectionId_yyyy-MM-dd
dalam bentuk yang tidak dibongkar.
Misalnya, perintah berikut:
dbtool export MyDb01 --zip=MyDbData.zip
akan membuat arsip ZIP dengan nama MyDbData.zip di direktori saat ini dan mengisinya dengan file data dalam format JSON (satu file untuk setiap tabel database).

Impor data
Anda dapat mengimpor data yang dibuat pada langkah sebelumnya kembali ke database Anda. Atau ke pangkalan lain dengan struktur yang sama.
Penting: DbTool tidak membuat tabel selama operasi impor. Dengan demikian, basis data tempat data diimpor harus sudah ada dan memiliki struktur yang sama (atau setidaknya serupa) dengan yang asli.
Perintah impor itu sendiri adalah sebagai berikut:
dbtool import {ConnectionId} [--input=path-to-file-or-folder] [--format=xml|json]
Opsi --input
memberitahu utilitas tempat mencari data yang diimpor. Jika jalur folder ditentukan, DbTool akan mengimpor file .xml atau .json di folder ini. Jika ini adalah file ZIP, maka utilitas akan terlebih dahulu membuka ritsleting arsip ini dan dari sana mengambil file data yang diperlukan.
Seperti pada kasus sebelumnya, --format
dapat dihilangkan karena DbTool dapat mengenali format dengan ekstensi file.
Contoh:
dbtool import MyDb01 --input=MyDbData.zip
Perpustakaan Korzh.DbUtils
Utilitas DbTool itu sendiri dibangun berdasarkan perpustakaan open-source Korzh.DbUtils , yang mencakup beberapa paket dengan implementasi beberapa operasi basis data dasar.
Korzh.DbUtils
Menentukan abstraksi dasar dan antarmuka seperti IDatasetExporter, IDatasetImporter, IDataPacker, IDbBridge
Korzh.DbUtils.Import
Berisi implementasi antarmuka IDatasetImporter untuk format XML dan JSON. Selain itu, paket ini termasuk kelas DbInitializer, yang dapat Anda gunakan untuk mengisi data dalam proyek Anda (lebih lanjut tentang ini di bawah).
Ekspor
Berisi implementasi IDatasetExporter untuk XML dan JSON.
Korzh.DbUtils.SqlServer
Berisi implementasi antarmuka operasi basis data dasar (IDbBridge, IDbReader, IDbSeeder) untuk MS SQL Server.
Korzh.DbUtils.MySQL
Berisi implementasi antarmuka basis data untuk MySQL.
Di sini Anda dapat menemukan referensi lengkap tentang API perpustakaan Korzh.DbUtils .
Menggunakan Korzh.DbUtils untuk mengisi basis data dengan data pada saat startup aplikasi
Sekarang, sebenarnya, kita akan mempertimbangkan bagaimana menggunakan DbTool dan Korzh.DbUtils untuk mengimplementasikan skrip dasar untuk mengisi (seeding) basis data pada peluncuran pertama aplikasi.
Misalkan Anda memiliki "salinan master" dari beberapa database yang Anda perlu "salin" di komputer pengguna ketika Anda pertama kali memulai aplikasi.
Langkah 1: Ekspor Master Copy ke JSON
Cukup instal DbTool, seperti dijelaskan di atas, tambahkan koneksi ke database dan jalankan perintah ekspor untuk menyimpan semua data dari database ini ke folder terpisah:
dotnet tool install -g Korzh.DbTool dbtool connections add MyMasterDb mssql "{ConnectionString}" dbtool export MyMasterDb
Langkah 2: Tambahkan file data ke proyek kami
Setelah langkah sebelumnya, kami memiliki folder baru, dari bentuk MyMasterDb-yyyy-MM-dd, dengan banyak file JSON (satu untuk setiap tabel). Cukup salin konten folder ini ke App_Data \ DbSeed proyek .NET (Core) kami. Harap dicatat bahwa untuk proyek-proyek di bawah .NET Framework Anda juga perlu menambahkan file-file ini secara manual ke proyek.
Langkah 3: Kode inisialisasi DB
Meskipun proses itu sendiri (hingga beberapa perincian) berlaku untuk semua jenis proyek di bawah .NET Core atau .NET Framework (versi 4.6.1 atau lebih tinggi), untuk kesederhanaan deskripsi, misalkan kita berbicara tentang proyek ASP.NET Core yang bekerja dengan Database SQL Server dan bahwa database ini dibuat secara otomatis menggunakan Entity Framework Core.
Jadi, untuk mengatasi masalah mengisi database dengan data pada awal pertama, kita perlu:
1. Instal paket perpustakaan Korzh.DbUtils ke proyek NuGet
Dalam hal ini, kita membutuhkan 2 diantaranya:
- Korzh.DbUtils.Import
- Korzh.DbUtils.SqlServer
2. Tambahkan kode inisialisasi
Berikut adalah contoh kode yang harus kita tambahkan di akhir metode Startup.Configure:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { . . . . app.UseMvc(); using (var scope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope()) using (var context = scope.ServiceProvider.GetService<AppDbContext>()) { if (context.Database.EnsureCreated()) {
Untuk menjadikan semuanya sangat indah, atau jika Anda perlu melakukan inisialisasi tambahan pada awal pertama (misalnya, tambahkan beberapa akun pengguna dan / atau peran pengguna), maka lebih baik untuk merancang semua kode ini sebagai metode ekstensi terpisah (sebut saja EnsureDbInitialized
) untuk antarmuka IApplicationBuilder
.
Contoh implementasi semacam itu dapat ditemukan di GitHub dalam proyek demo untuk pustaka EasyQuery .
Dalam hal ini, Anda hanya perlu menambahkan satu panggilan di akhir metode Startup Anda. Konfigurasikan:
public void Configure ( IApplicationBuilder, IHostingEnvironment) { . . . . app.UseMvc ();
Rencana masa depan
Meskipun pustaka dan utilitas ditulis dalam skenario yang sangat spesifik, kami mencoba melakukan segala sesuatu sefleksibel dan seluas mungkin, sehingga mengaktifkan fungsi tambahan tidak akan menjadi masalah.
Dari kemungkinan peningkatan, kami melihat hal berikut:
Dukungan untuk database lain (PostgreSQL, Oracle, SQLite, MariaDB)
Format baru tempat Anda dapat mengekspor data (CSV, Excel, HTML)
Operasi menyalin data secara langsung dari basis data ke basis data (sekarang Anda dapat menerapkannya melalui beberapa panggilan berurutan ke perintah ekspor / impor)
Operasi pencadangan / pengembalian penuh dengan pelestarian penuh struktur database dan pembuatannya dari awal selama pemulihan.
Kami akan senang mendengar saran atau komentar dan sangat berterima kasih atas bintang-bintang baru untuk repositori perpustakaan GitHub :)
Terima kasih atas perhatian anda!