Operatiile CRUD cu Dapper au devenit simple.

Dommel ofera un API convenabil pentru operatiuni CRUD utilizand metode de extensie de pe interfata IDbConnection. Interogarile SQL sunt generate pe baza entitatilor dvs. POCO. Dommel accepta, de asemenea, expresiile LINQ care sunt traduse in expresii SQL. Dapper este utilizat pentru executarea interogarilor si maparea obiectelor.

Exista mai multe puncte de extensibilitate disponibile pentru a schimba comportamentul rezolvarii numelor de tabele, numele coloanelor, proprietatea cheie si proprietatile POCO. Consultati Extensibilitatea pentru mai multe detalii.

Descarca

Dommel este disponibil pe NuGet:

Utilizarea CLI .NET Core:

dotnet add package Dommel

Utilizarea Managerului de pachete NuGet:

PM> Install-Package Dommel

API

Preluarea entitatilor dupa ID

folosind (var con = new SqlConnection ()) {var product = con.Get <Product> (1); }

Preluarea tuturor entitatilor dintr-un tabel

using (var con = new SqlConnection ()) {var products = con.GetAll <Product> () .ToList (); }

Selectarea entitatilor folosind un predicat

Dommel va permite sa specificati un predicat care este tradus intr-o expresie SQL. Argumentele din expresia lambda sunt adaugate ca parametri la comanda.

using (var con = new SqlConnection ()) {var products = con.Select <Product> (p => p.Name == “Bicicleta minunata”); var products = con.Select <Product> (p => p.Created <new DateTime (2014, 12, 31) && p.InStock> 5); }

Interogari similare

Este posibil sa generati interogari LIKE folosind Contains (), StartsWith () sau EndsWith () pe proprietatile sirului:

folosind (var con = new SqlConnection ()) {var products = con.Select <Product> (p => p.Name.Contains (“bike”)); var products = con.Select <Product> (p => p.Name.StartsWith (“bike”)); var products = con.Select <Product> (p => p.Name.EndsWith (“bike”)); }

Inserarea entitatilor

folosind (var con = new SqlConnection ()) {var produs = produs nou {Nume = “Bicicleta minunata”, InStock = 4}; int id = con.Insert (produs); }

Actualizarea entitatilor

folosind (var con = new SqlConnection ()) {var product = con.Get <Product> (1); product.LastUpdate = DateTime.UtcNow; con.Actualizare (produs); }

Eliminarea entitatilor

folosind (var con = new SqlConnection ()) {var product = con.Get <Product> (1); sterge (produs); }

Cartografiere multipla

Relatiile unu-la-unu

Dommel este capabil sa genereze interogari de asociere bazate pe functia de mapare multipla specificata. Luati in considerare urmatoarele POCO:

public class Produs {public int Id {get; a stabilit; } public string Nume {get; a stabilit; } // Harti catre coloana cu cheie straina public int CategoryId {get; a stabilit; } // Proprietatea de navigare Categorie publica Categorie {get; a stabilit; }} public class Categorie {public int Id {get; a stabilit; } public string Nume {get; a stabilit; }}

Produsul cu categoria sa asociata poate fi interogat impreuna utilizand metoda Get <T1, T2, …, TResult> ():

Coloane cu cheie straina

CategoryId este utilizat automat ca cheie straina intre produs si categorie. Aceasta urmeaza o conventie simpla: unirea numelui tabelului + Id (Categorie + Id). Puteti inlocui acest comportament utilizand atributul [ForeignKey (“ForeignKeyColumnName”)] sau prin implementarea propriului dvs. IForeignKeyPropertyResolver.

Relatii intre multi

Relatiile unu la mai multe functioneaza intr-un mod similar, asteptati-va ca cheia externa este definita pe tipul unit, mai degraba decat pe tipul sursa . De exemplu:

public class Order {public int Id {get; a stabilit; } // Proprietatea de navigare publica ICollection <OrderLine> OrderLines {get; a stabilit; } = lista noua <OrderLine> (); } public class OrderLine {public int Id {get; a stabilit; } // Coloana cu cheie straina a tabelului de comenzi public int OrderId {get; a stabilit; } sir public Descriere {get; a stabilit; }}

Comanda cu copilul sau OrderLine poate fi interogata impreuna utilizand metoda Get <T1, T2, …, TResult> ():

var product = product.Get <Order, OrderLine, Order> (1, (order, line) => {// Exemplu de cartografiere naiv, in realitate necesita mai multe ordine de gimnastica.OrderLines.Add (line); return return;}) ;

Cartografiere automata multipla

Nota: aceasta este o caracteristica experimentala.

Dommel este capabil sa creeze expresii de imbinare simple pentru recuperarea entitatilor parinte-copil. Relatiile unu-la-unu si unu-la-multe sunt acceptate. Functioneaza in acelasi mod ca o cartografiere obisnuita, cu exceptia faptului ca nu este nevoie sa specificati o functie care efectueaza cartarea obiectelor. Folosind aceleasi POCO ca exemplele anterioare:

Preluarea unui produs si a categoriei sale asociate:

var product = product.Get <Produs, Categorie, Produs> (1);

Preluarea unei singure comenzi si impreuna cu a acesteia OrderLine:

var product = product.Get <Order, OrderLine, Order> (1);

Egalitatea entitatilor

Cand va alaturati cu doua sau mai multe tabele cu o relatie unu-la-multi, vi se cere sa suprascrieti metoda Equals (obiect obj) sau sa implementati interfata IEquatable <T> pe POCO, astfel incat Dommel sa poata stabili daca o entitate este deja adaugata la Colectie. De exemplu:

public class OrderLine: IEquatable <OrderLine> {public int Id {get; a stabilit; } public int OrderId {get; a stabilit; } sir public Descriere {get; a stabilit; } public bool Equals (OrderLine other) => Id == other.Id; }

Asincron

Toate metodele Dommel au omologi asincroni, cum ar fi GetAsync, GetAllAsync, SelectAsync, InsertAsync, UpdateAsync, DeleteAsync etc.

Constructorii de interogari

Dommel accepta crearea de interogari specializate pentru un anumit RDBMS. In mod implicit, sunt inclusi constructorii de interogari pentru urmatoarele RDMBS: SQL Server, SQL Server CE, SQLite, MySQL si Postgres. Generatorul de interogari care trebuie utilizat este determinat de tipul de conexiune. Pentru a adauga sau a suprascrie un constructor de interogari existent, utilizati metoda AddSqlBuilder ():

DommelMapper.AddSqlBuilder (typeof (SqlConnection), nou CustomSqlBuilder ());

Extensibilitate

ITableNameResolver

Implementati aceasta interfata daca doriti sa personalizati rezolvarea numelor de tabele atunci cand creati interogari SQL.

public class CustomTableNameResolver: DommelMapper.ITableNameResolver {public string ResolveTableName (Type type) {// Fiecare tabel are prefixul „tbl”. returneaza $ “tbl {type.Name}”; }}

Utilizati metoda SetTableNameResolver () pentru a inregistra implementarea personalizata:

DommelMapper.SetTableNameResolver (nou CustomTableNameResolver ());

IKeyPropertyResolver

Implementati aceasta interfata daca doriti sa personalizati rezolvarea proprietatii cheie a unei entitati. In mod implicit, Dommel va cauta o proprietate cu atributul [Cheie] sau o coloana cu numele „Id”.

Daca aveti, de exemplu, conventia de numire a {TypeName} Id pentru proprietatile cheie, veti implementa IKeyPropertyResolver astfel:

public class CustomKeyPropertyResolver: DommelMapper.IKeyPropertyResolver {public PropertyInfo ResolveKeyProperty (Type type) {return type.GetProperties (). Single (p => p.Name == $ “{type.Name} Id”); }}

Utilizati metoda SetKeyPropertyResolver () pentru a inregistra implementarea personalizata:

DommelMapper.SetKeyPropertyResolver (nou CustomKeyPropertyResolver ());

IForeignKeyPropertyResolver

Implementati aceasta interfata daca doriti sa personalizati rezolvarea proprietatii cheii straine de la o entitate la alta. In mod implicit, Dommel va cauta o proprietate cu {TypeName} Id sau numele coloanei specificat folosind atributul [ForeignKey].

Aceasta este o interfata destul de avansata. Furnizarea propriei implementari necesita o anumita cunoastere a modului in care Dommel gestioneaza relatiile cheie straine. Luati in considerare subclasarea DefaultForeignKeyPropertyResolver si suprascrie ResolveForeignKeyProperty ().

Utilizati metoda SetForeignKeyPropertyResolver () pentru a inregistra implementarea personalizata:

DommelMapper.SetForeignKeyPropertyResolver (nou CustomForeignKeyPropertyResolver ());

IColumnNameResolver

Implementati aceasta interfata daca doriti sa personalizati rezolvarea numelor de coloane pentru atunci cand creati interogari SQL. Acest lucru este util atunci cand conventiile de numire pentru coloanele bazei de date sunt diferite de proprietatile dvs. POCO.

public class CustomColumnNameResolver: DommelMapper.IColumnNameResolver {sir public ResolveColumnName (PropertyInfo propertyInfo) {// Fiecare coloana are prefixul „fld” si este cu majuscule. returneaza $ “fld {propertyInfo.Name.ToUpper ()}”; }}

Utilizati metoda SetColumnNameResolver () pentru a inregistra implementarea personalizata:

DommelMapper.SetColumnNameResolver (nou CustomColumnNameResolver ());

Extensia Dapper.FluentMap.Dommel implementeaza aceste interfete utilizand maparea configurata a Dapper.FluentMap. A se vedea, de asemenea: Dapper.FluentMap.