În prim plan - cod în primul rând, și baza de date de inițializare

Deși termenul «DevOps» relativ nou, iar recent a început să acopere activități mult mai ample, în special testarea automată și desfășurarea, eu cred că primul eșantion al operațiunilor automatizabil dezvoltator la fel de vechi ca software-ul în sine. Vreau să spun capacitatea specifică de a crea și inițializa baza de date atunci când este instalată aplicația. Multe companii „de software-ul“ sunt în curs de dezvoltare un sisteme integrate pe verticală, care sunt apoi vândute la o varietate de clienți și să se adapteze la nevoile lor.







Aspecte ale unor astfel de sisteme, care pot fi ajustate, în funcție de caracteristicile produsului și domeniul afacerilor, dar îndrăznesc să spun că chiar minim, orice software vertical integrabilă trebuie să fie specifice în baza de date a clientului. Prin urmare, baza de date trebuie să fie create cu tabele și diagrame necesare într-un anumit context și umplut cu date „în loc.“

Nu toate sarcinile necesare întotdeauna posibil pentru a automatiza și integra în produsul în sine. Imaginați-vă, de exemplu, importarea datelor existente. Sunt date importate în fișiere Excel sau în baze de date moștenite, este probabil că necesitatea de a crea într-un fel unele mijloace pentru a importa datele și încărcați-l într-un nou depozit. Cu toate acestea, în cazul în care cererea de acces la nivelul de date pe care îl utilizați Codul În primul 6.x Entity Framework, atunci, cel puțin, de a crea diagrame și tabele în baza de date pentru a automatiza cu ușurință și de a efectua prima dată când rulați aplicația perfect.

În acest articol, voi sublinia pe scurt câteva dintre instrumentele disponibile pentru o lungă perioadă de timp în primul cod, prin prisma cererii pentru o varietate de clienti (aplicatii multi-client). În special, mă voi concentra pe modul de a crea și popula baza de date, precum și modul de a determina numele său programatic și șirul de conexiune.

Noi de stabilire bazele pentru tabele circuite

Să presupunem că aveți un nou proiect Visual Studio, care este deja asociat cu 6.x. NuGet-cadru de servicii Entitate Următorul pas, care ar putea fi necesare, - crearea unei biblioteci de clasă pentru accesarea datelor sau cel puțin un dosar separat în proiectul curent pentru a salva toate fișierele, care sunt într-un fel legate de funcționalitatea de acces la date. În conformitate cu regulile de cadru Entitate, trebuie să aveți o DbContext de clasă, care reprezintă punctul de intrare în subsistem de gestionare a datelor de aplicare. Aici este un exemplu de astfel de aplicații specifice clasei:

Cele mai multe dintre exemplele care pot fi găsite pentru primul cod, bazat pe utilizarea șir de conexiune fixă ​​și permanentă care se face referire în fișierul de configurare sau care este transmis în contextul clasei în mod clar. Rezultatul final este că primul cod creează o bază de date folosind șirul de conexiune furnizat atunci când porniți prima dată aplicația. Să aruncăm o privire mai atentă la acest aspect.

Class DbContext suportă patru strategii de inițializare enumerate în tabelul. 1.

Tabel. 1. Strategia Codul În primul rând, în inițializarea bazei de date

Se verifică dacă există o bază de date, iar în cazul în care nu găsește, creează o bază de date. Dacă baza de date exista, dar are o schemă incompatibil, acesta aruncă o excepție.

Notă. Aceasta este initializatorul implicit

Se creează baza de date în cazul în care nu există. Dacă baza de date exista, dar are o schemă incompatibilă, înlătură aceasta și creează o nouă

De fiecare dată când lansați aplicația, ștergeți baza de date existentă și re-creează

Clasa propriu de initializare este scris pentru a crea un comportament, care nu a oferit de oricare dintre celelalte initializatori.

Notă. Ar trebui să utilizați această opțiune pentru a adăuga conținut la baza de date de master-


Potrivit implicit CreateDatabaseIfNotExists de comportament, de fiecare dată când creați de clasă context, se verifică dacă există realizabil și dacă baza de date la care se referă cererea. Dacă nu, este creat. În cazul în care baza de date există și este realizabil, dar este incompatibil cu schema structurii deschise a claselor entități, o excepție este aruncată. Pentru a scapa de o excepție, trebuie să editați clasa entitate, sau, mai probabil, pentru a modifica schema bazei de date sau prin intermediul interfeței software-ului, sau prin utilizarea de script-ul de migrare bazat pe Entity Framework.







Mi se pare o opțiune ideală atunci când cererea ajunge la nivelul sistemului de producție. Dar, în etapa de dezvoltare, prefer DropCreateDatabaseIfModelChanges opțiune, ceea ce de fapt, mă protejează de orice rutină asociată cu suport de baze de date: puteți ajusta pur și simplu clasele entitate ca ai nevoie, și Entity Framework vor face modificări în baza de date, când apăsați F5 data viitoare în Visual Studio. Pentru a activa strategia de inițializare ales, adăugați propria clasă DbContext constructorului următoarea linie de cod:

Rețineți că puteți specifica și initializatorul bazei de date în fișierul de configurare, care poate fi o idee bună, dacă aveți de gând să utilizați o strategie diferită de mediul de producție și dezvoltare.

Pentru a rezuma, primul cod vă permite să scrie o aplicație care creează automat toate tabelele din baza de date atunci când porniți prima dată. Cu alte cuvinte, trebuie doar să copiați fișierele, și apoi executați aplicația. Cu toate acestea, acest comportament funcționează cel mai bine, în cazul în care sistemul este proiectat pentru un client. Când creați un sistem pentru mai mulți clienți, cel mai bun lucru pe care le puteți face - utiliza utilitarul de configurare.

Unul dintre motivele pentru care o abordare oarecum diferită este că s-ar putea nevoie de o bază de date diferită de denumire, de exemplu, pe care doriți să le adăugați la numele prefixului specifice clientului. Fig. 2 prezintă un schelet al unui utilitar de linie de comandă. Programul are prefixul specific pentru client din linia de comandă, în mod corespunzător formatează numele bazei de date, și apoi se referă la un derivat de clasa DbContext care re-creează baza de date și populează cu datele inițiale corespunzătoare.

Fig. 2. specifică numele bazei de date clientului

umplere inițială a bazei de date

Orice sistem conceput pentru a se adapta la nevoile clienților într-un singur set de zona de afaceri ar trebui să aibă un număr de tabele alocate pentru a salva opțiunile și preferințele, diferite pentru fiecare client. Aceste informații ar trebui să fie puse la dispoziție într-un fel sau altul în timpul procesului de instalare a software-ului. În condiții reale, partea inițială a bazei de date este comună tuturor plantelor, dar o altă parte - pentru un anumit client. Partea care depinde de datele clientului, importate în mod obișnuit din surse externe și necesită proceduri de specialitate ca un script sau un cod compilat. În anumite contexte, poate fi adecvată chiar și un mecanism încorporat dependențe să rezume importurile de structura capitalului în instalația de utilități, care inițializează baza de date. Cu toate acestea, pentru baza de date cu conținut static, primul cod oferă servicii specializate.

initializatori proprii

Pentru a pune datele în baza de date în timpul inițializării, aveți nevoie pentru a crea propria bază de date initializare, așa cum este descris în tabelul. 1. initializare propriu (initializare personalizat) - este o clasă derivată de la una dintre initializatori predefinite, cum ar fi DropCreateDatabaseIfModelChanges. Singura cerință strictă pentru această clasă - Seed Suprascriere:

Punerea în aplicare a metodei Seed executați orice cod care populează un tabel de baze de date și să le invite folosind DbContext furnizat. Asta e tot.

Dacă sunteți de planificare o cerere pentru mai mulți clienți, definiția propriei sale de initializare va fi un pas în direcția cea bună, deoarece vă va da un singur punct, în cazul în care vă va determina forma bazei de date inițiale pentru fiecare client în parte. Acesta este un obișnuit initializare C # -clasa, astfel încât acesta poate sprijini instrumente dependențe integrate pentru a se lega la anumite părți ale logicii că importurile de date de acolo în cazul în care acestea sunt.

Ultimul dar nu cel mai puțin, baza de date pot fi deconectate initializatori cu baza de date de instalare a rămas complet operație separată poate fi chiar și controlată de un alt sau IT- DevOps-grup. Pentru a raporta infrastructurii primul cod ignora orice initializatori, ar trebui să pună în constructorul dvs. DbContext-clasă următorul cod:

De exemplu, este o opțiune sigură pentru a utiliza atunci când eliberați o actualizare a sistemelor existente. Dezactivarea asigură că initializare nu sunt în nici un caz nu va pierde datele existente.

concluzie

În cele din urmă Codul În primul rând vă permite să scrie aplicații multitenantnye și aplicații pentru mai mulți clienți, așa că, dacă o faci în special pentru bine-cunoscut configurația și client. Necesare doar unele cunoștințe din șirul de conectare de atribuire și procesul de inițializare. Principiile de bază Entitatea cadru de bază rămân aceleași, cu toate detaliile privind modul în care acestea funcționează, s-au schimbat. În special, o nouă clasă a apărut DbContext suprascrie OnConfiguring, prin care vă conectați la furnizorul selectat de baze de date de context și trece identitatea și alte elemente.

Îmi exprim recunoștința pentru revizuirea articolului Microsoft expertul Andrea Saltarello (Andrea Saltarello).