buscando un buen ejemplo para crear un registro de db con dapper / sproc

dapper orm

Pregunta

¿Puede indicarme un buen ejemplo para crear un registro de db con Dapper via sproc? Idealmente, tomaría un enfoque OO similar a EF como este:

var user = new User{ FirstName="John", LastName="Smith"}
var userId = dapper.Create(User);
return userId;

Por supuesto, estoy abierto a la forma "correcta" de hacer esto en dapper si dapper recomienda un enfoque diferente

Respuesta aceptada

Suponiendo que tiene un procedimiento almacenado para agregar un registro a la tabla de usuario como

CREATE PROCEDURE SaveUser(@firstName VARCHAR(10),@lastName VARCHAR(10))
AS
    BEGIN
       INSERT INTO [User] (FirstName,LastName) VALUES (@firstName ,@lastName);
       SELECT SCOPE_IDENTITY()
    END

Suponiendo que su tabla de Usuario tiene una columna Id (PK) configurada en Identidad. Ahora, puede ejecutar su procedimiento almacenado de esta manera

var conStr="Replace your connection string here";
using (var con = new SqlConnection(conStr))
{
   var userId = con.Query<int>("SaveUser", 
                                    new {@firstName = "John", @lastName = "Smith"},
                                    commandType: CommandType.StoredProcedure
                              ).First();          
}

Si tiene una clase para representar el registro de la tabla de usuario, puede pasar ese objeto de clase cuando llame al proceso almacenado.

public class UserDto
{
  public string FirstName { set;get;}
  public string LastName { set;get;}
}

¡y simplemente pasa el objeto de esto!

var conStr="Replace your connection string here";
var u = new UserDto { FirstName = "Johny", LastName= "Depp" };
using (var con = new SqlConnection(conStr))
{
   var userId = con.Query<int>("SaveUser", u, commandType: CommandType.StoredProcedure)
                   .First();          
}

Respuesta popular

También es posible que desee echar un vistazo a Drapper (construido sobre Dapper) que le permitiría hacer algo como esto.

// instance of user created somewhere & procedure called
// on repository method.
var user = new User { FirstName = "John", LastName = "Smith" };
_commander.Execute(user) ? user : null;

Asumiendo que estás usando una clase de repositorio de algún tipo. Me he tomado la libertad de desarrollar un poco más de código, agregando un poco de amor de inyección de constructor.

public class UserRepository : IUserRepository
{
    // the IDbCommander is a Drapper construct
    private readonly IDbCommander _commander;

    public UserRepository(IDbCommander commander)
    {
        _commander = commander;
    }

    public User Create(User user)
    {
        // execute your procedure here (looked up in config)
        return _commander.Execute(user) ? user : null;
    }

    public IEnumerable<User> RetrieveAll()
    {
        return _commander.Query<User>();
    }
}

Su código SQL luego se guardará en un archivo separado (configuración json o xml).

Esto mantiene su C # separado de su SQL facilitando la vida a largo plazo: los cambios en su SQL no implican la recompilación de su código, su clase de repositorio se vuelve más comprobable, etc. etc., etc.

{
  "Namespaces": [
    {
      "Namespace": "Company.Product.Namespace",
      "ConnectionString": {
          "ProviderName": "System.Data.SqlClient",
          "ConnectionString": "Data Source=(LocalDb)\\mssqllocaldb;Initial Catalog=DrapperTests;Integrated Security=true"
      },      
      "Types": [
        {
          "Name": "Company.Product.Namespace.UserRepository",          
          "Commands": {
              "Create": {
                  "CommandText": "[dbo].[usp_CreateUser]",              
                  "CommandType": 4              
                },
              "RetrieveAll": {
                  "CommandText": "select * from [User];",              
                  "CommandType": 1              
                }
             }
          } 
       ]
     }
  ]
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué