2016-03-24 27 views
5

Ho giocato con Dapper, cercando di capire se si tratta di un'alternativa leggera a Entity Framework. Finora sono rimasto impressionato dalla sua capacità di estrarre rapidamente un'entità <model> da un DB e di inserirla in un oggetto IEnumerable di un modello, o semplicemente creare una singola istanza di un modello. Molto lucidoÈ possibile utilizzare Dapper per aggiornare e inserire modelli?

Ma quello che non vedo è un modo semplice per aggiornare il modello al db.

Esempio:

public class Dog 
{ 
    public Guid Id { get; set; } 
    public int? Age { get; set; } 
    public string Name { get; set; } 
    public float? Weight { get; set; } 
} 

si possono facilmente creare un IEnumerable del cane nel modo seguente:

IEnumerable<Dog> dogs = connection.Query<Dog>("SELECT * FROM Dog") 

Oppure, per una singola istanza:

Dog dog = connection.Query<Dog>("SELECT * FROM Dog WHERE DogId = @dogid") 

Che tutto funziona alla grande. Ma ora, se apportiamo modifiche al "cane" (diciamo, cambiamo solo il suo peso), c'è un modo rapido, semplice e veloce per riportare quell'entità nel database senza dover fare una query UPDATE manuale, elencando ogni campo ?

Grazie!

+1

Sembra che il superamento di un '' lista dovrebbe [inserire più voci] (http://stackoverflow.com/a/6500834/69809)? Bisogna attenersi alle query parametrizzate ('SELECT * FROM Dog WHERE DogId = @ DogId'), a meno che non vi piacciano gli attacchi SQL injection. – Groo

+0

Come funzionerebbe questa sintassi? Guardando il file Leggimi su GitHub, non sto vedendo un esempio di questo. https://github.com/StackExchange/dapper-dot-net –

+0

Presumibilmente mi piace la risposta che ho collegato a: 'connection.Execute (@" aggiorna Dog set Name = @ Name, Age = @ Age ", lista);'? – Groo

risposta

6

È possibile utilizzare la classe SqlMapperExtensions da Dapper.Contrib.Extensions:

using Dapper; 
using Dapper.Contrib.Extensions; 

// don't forget the using since Update is an extension method 

Dog entity; // you got it from somewhere 
entity.Name = "fancy new dog name"; 
connection.Update(entity); 

Affinché ciò funzioni è necessario aggiungere l'annotazione [] per il vostro id. dovrebbe essere simile a questo:

using System.ComponentModel.DataAnnotations; 

public class Dog 
{ 
    [Key] 
    public long Id { get; set; } 
    public int? Age { get; set; } 
    public string Name { get; set; } 
    public float? Weight { get; set; } 
} 
+0

Ok! Questo è molto più quello che speravo. Ci vorrà un po 'prima che riesca a metterlo alla prova, ma dopo che lo farò, e quando lo farò funzionare, segnerò questa come risposta. –

6

Dapper è un Micro-Orm avente le caratteristiche di essere semplice e veloce. Il comportamento che descrivi è più correlato all'ORM completo, che implica avere una sorta di concetto di sessione, mappatura e generazione di query (con sperabilmente driver per diversi tipi di SQL). Questo non è sicuramente lo spirito di Dapper, che in ogni caso rendere il processo di aggiornamento/inserimento easyer che ado.net pianura, accettando oggetto POCO come parametri per la tua ricerca, vale a dire:

.Execute("update mydogs set [email protected] where [email protected]",dog); 
+0

Ok, questo ha senso. Un paio di domande Come vengono popolati (at) Age e (at) Id? Sono riempiti automaticamente con il "cane" alla fine della query? (Non riesco a utilizzare il segno AT in questo commento o l'overflow dello stack pensa che sto tentando di avvisare un utente) –

+0

Sì, il parametro viene popolato prendendo dal valore della proprietà dell'istanza "cane", con i nomi corrispondenti –