使用ASP.Net MVC和Classic ADO.Net

San*_*rst 28 asp.net asp.net-mvc ado.net

我正在寻找一种使用Classic ADO.Net访问存储过程的方法,因为我是ASP.Net MVC的新手,我不知道如何去做.

大多数示例显示了使用ADO.Net Entity框架的CRUD操作.

Dar*_*rov 50

你可以有一个存储库:

public interface IUsersRepository
{
    public User GetUser(int id);
}
Run Code Online (Sandbox Code Playgroud)

然后实现它:

public class UsersRepository: IUsersRepository
{
    private readonly string _connectionString;
    public UsersRepository(string connectionString)
    {
        _connectionString = connectionString;
    }

    public User GetUser(int id)
    {
        // Here you are free to do whatever data access code you like
        // You can invoke direct SQL queries, stored procedures, whatever 

        using (var conn = new SqlConnection(_connectionString))
        using (var cmd = conn.CreateCommand())
        {
            conn.Open();
            cmd.CommandText = "SELECT id, name FROM users WHERE id = @id";
            cmd.Parameters.AddWithValue("@id", id);
            using (var reader = cmd.ExecuteReader())
            {
                if (!reader.Read())
                {
                    return null;
                }
                return new User
                {
                    Id = reader.GetInt32(reader.GetOrdinal("id")),
                    Name = reader.GetString(reader.GetOrdinal("name")),
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您的控制器可以使用此存储库:

public class UsersController: Controller
{
    private readonly IUsersRepository _repository;
    public UsersController(IUsersRepository repository)
    {
        _repository = repository;
    }

    public ActionResult Index(int id)
    {
        var model = _repository.GetUser(id);
        return View(model);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,控制器就不再依赖于数据访问层的实现:无论是使用普通的ADO.NET,NHibernate,EF,还是其他一些ORM,调用外部Web服务,XML,都可以命名.

现在剩下的就是配置你喜欢的DI框架,将存储库的正确实现注入控制器.如果明天您决定更改数据访问技术,没问题,只需编写不同的IUsersRepository接口实现并重新配置您的DI框架即可使用它.无需触摸控制器逻辑.

您的MVC应用程序不再依赖于数据的存储方式.这使得更容易对控制器进行单独测试,因为它们不再紧密耦合到特定数据源.

  • 优秀的方法 - 将它与Dapper结合起来,你可以为自己节省另一大堆无聊,令人难以置信的左右分配代码.... (5认同)
  • 很好的回答达林!使用好的旧ADO.Net - EF(根据我的经验)也会带来性能上的好处,有明显的缺点并且很慢,除非你花费数小时试图理解它发出的底层SQL并相应地进行优化. (2认同)

mar*_*c_s 11

查看Dapper-dot-net - 它是驱动这个网站的原因 - 优秀,轻量级,基于纯ADO.NET,非常好地支持存储过程 - 不能说它的好东西!