web-dev-qa-db-fra.com

Utilisation d'ASP.Net MVC avec Classic ADO.Net

Je cherche un moyen d'accéder aux procédures stockées en utilisant Classic ADO.Net, car je suis nouveau sur ASP.Net MVC, je ne sais pas comment m'y prendre.

La majorité des exemples montrent des opérations CRUD utilisant ADO.Net Entity Framework.

28
Sandhurst

Vous pourriez avoir un référentiel:

public interface IUsersRepository
{
    public User GetUser(int id);
}

puis implémentez-le:

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")),
                }
            }
        }
    }
}

puis votre contrôleur pourrait utiliser ce référentiel:

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

De cette façon, le contrôleur ne dépend plus de la mise en œuvre de votre couche d'accès aux données: que vous utilisiez ADO.NET, NHibernate, EF, un autre ORM, appelant un service Web externe, XML, vous l'appelez.

Il ne vous reste plus qu'à configurer votre framework DI préféré pour injecter la bonne implémentation du référentiel dans le contrôleur. Si demain vous décidez de changer votre technologie d'accès aux données, pas de problème, écrivez simplement une implémentation différente de l'interface IUsersRepository et reconfigurez votre framework DI pour l'utiliser. Pas besoin de toucher la logique de votre contrôleur.

Votre application MVC n'est plus liée à la façon dont les données sont stockées. Cela facilite également le test unitaire de vos contrôleurs de manière isolée, car ils ne sont plus étroitement couplés à une source de données particulière.

50
Darin Dimitrov

Découvrez Dapper-dot-net - c'est ce qui anime ce site - excellent, léger, basé sur ADO.NET pur, supporte très bien les procédures stockées - ne peut pas en dire assez de bien!

11
marc_s

ASP.NET MVC fonctionne avec n'importe quel cadre de base de données que vous souhaitez utiliser. Vous pouvez récupérer vos données comme vous le souhaitez (comme ADO.NET classique) et transmettre le modèle de données résultant à la vue. Il vous suffit de spécifier le type de modèle dans la vue pour qu'il corresponde à l'objet que vous lui passez.

3
Daniel Young

Si vous savez comment le faire avec ADO.NET, vous pouvez le faire dans ASP.NET MVC (sachez que ce sont des cadres absolument différents qui ne dépendent pas les uns des autres).

Vous pouvez encapsuler votre code DataAccess dans des référentiels et utiliser ces référentiels dans des contrôleurs;

2
Alexander Beletsky