寻找一个用dapper / sproc创建db记录的好例子

时间:2016-08-17 15:07:34

标签: orm dapper

你能指点一个通过sproc用Dapper创建db记录的好例子吗?理想情况下,我会采用类似于EF的OO方法:

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

当然,我对#34;右边"如果dapper建议采用不同的方法,那么在短小精悍中这样做的方法

2 个答案:

答案 0 :(得分:0)

假设您有一个存储过程将记录添加到User表,如

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

假设您的User表将Id列(PK)设置为Identity。 现在,您可以像这样执行存储过程

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();          
}

如果您有一个表示User表记录的类,则可以在调用存储过程时传递该类对象。

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

并简单地传递此对象!

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();          
}

答案 1 :(得分:0)

你可能还想看一下Drapper(建立在Dapper之上),它可以让你做这样的事情。

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

假设您正在使用某种类型的存储库类。我已经冒昧地充实了更多的代码,添加了一些构造函数注入爱。

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>();
    }
}

然后,您的SQL代码将保存在单独的文件(json或xml config)中。

这样可以使您的C#与SQL分离,从长远来看,使您的生活变得更轻松 - 对SQL的更改不会涉及重新编译代码,您的存储库类变得更易于测试等等。

{
  "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              
                }
             }
          } 
       ]
     }
  ]
}