From 6e3b8936560e52e1a2d62ed3de2f3de5fa790ccc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 1 Apr 2023 01:00:26 +0300 Subject: [PATCH] Completed the Dapper article --- .../2023-03-20-Dapper/POST.md | 223 +++++++++++++++++- .../2023-03-20-Dapper/book-class-in-rider.png | Bin 0 -> 8029 bytes .../2023-03-20-Dapper/book-database-table.png | Bin 0 -> 8340 bytes .../2023-03-20-Dapper/book-table-data.png | Bin 0 -> 8119 bytes .../2023-03-20-Dapper/list-of-books.png | Bin 0 -> 9642 bytes 5 files changed, 217 insertions(+), 6 deletions(-) create mode 100644 docs/en/Community-Articles/2023-03-20-Dapper/book-class-in-rider.png create mode 100644 docs/en/Community-Articles/2023-03-20-Dapper/book-database-table.png create mode 100644 docs/en/Community-Articles/2023-03-20-Dapper/book-table-data.png create mode 100644 docs/en/Community-Articles/2023-03-20-Dapper/list-of-books.png diff --git a/docs/en/Community-Articles/2023-03-20-Dapper/POST.md b/docs/en/Community-Articles/2023-03-20-Dapper/POST.md index 4fae76c4bb..9860013766 100644 --- a/docs/en/Community-Articles/2023-03-20-Dapper/POST.md +++ b/docs/en/Community-Articles/2023-03-20-Dapper/POST.md @@ -15,7 +15,7 @@ In ABP Framework, we suggest to use Dapper in a combination with Entity Framewor * EF Core's change tracking system automatically update changes in the database. * EF Core is better compatible with Object Oriented Programming (OOP) practices and is more type safe to work with. So, EF Core code is more understandable and maintainable. -In most of your use cases, you typically work with one or a few entities and a maintainable codebase can be chosen instead of slight performance difference. However, there may be certain places in your application where it matters: +In most of your use cases, you typically work with one or a few entities and a maintainable codebase can be chosen instead of a slight performance difference. However, there may be certain places in your application where it matters: * You may work with a lot of entities, so want to query faster (Indeed, EF Core's [AsNoTracking()](https://learn.microsoft.com/en-us/ef/core/querying/tracking) extension can help in most cases). * You may be performing too many database operations in a single request. @@ -23,6 +23,32 @@ In most of your use cases, you typically work with one or a few entities and a m For such cases, Dapper can be a good choice. You can easily write SQL queries and bind the result to your objects. +## Creating a new ABP Solution + +To demonstrate the Dapper usage, I've created an ABP solution. You can find the [full source code of the demo application here](https://github.com/abpframework/abp-samples/tree/master/Dapper). If you want to create the same solution from scratch, follow the steps below: + +Install the ABP CLI if you haven't installed it before: + +````bash +dotnet tool install -g Volo.Abp.Cli +```` + +Create a new solution with the ABP Framework's non-layered startup template with MVC UI and EF Core database: + +```` +abp new DapperDemo -t app-nolayers +```` + +> The startup template or a different UI selection don't matter for this article. I selected these options to keep the demo solution simple. + +After creating the solution, run the following command to migrate the database (run the command in the folder of the `.csproj` file: + +````csharp +dotnet run --migrate-database +```` + +> If you've created a layered solution, then run the `DbMigrator` application inside the solution. If you have trouble by creating the solution, please refer to the [Quick Start](https://docs.abp.io/en/abp/latest/Tutorials/Todo/Single-Layer/Index) document. + ## Setting Up the Entity Framework Core Part We will use EF Core with Dapper, so we need to configure the EF Core first. I will use the following `Book` entity as an example: @@ -36,12 +62,16 @@ public class Book : AuditedAggregateRoot } ```` -Once I created the `Book` entity, I should add it to my `DbContext` class. +If you are using a layered solution, entities are located in the `Domain` project. For my demo solution, I just placed it in the `Entities` folder of the single project: + +![book-class-in-rider](book-class-in-rider.png) + +Once I created the `Book` entity, I should add it to my `DbContext` class: ````csharp public class DapperDemoDbContext : AbpDbContext { - // 1 - ADD A DBSET PROPERTY + // 1: ADD A DBSET PROPERTY public DbSet Books { get; set; } public DapperDemoDbContext(DbContextOptions options) @@ -53,7 +83,7 @@ public class DapperDemoDbContext : AbpDbContext { //...other code parts - // 1 - MAP YOUR ENTITY TO THE DATABASE TABLE + // 2: MAP YOUR ENTITY TO A DATABASE TABLE builder.Entity(b => { b.ToTable("Books"); @@ -64,7 +94,77 @@ public class DapperDemoDbContext : AbpDbContext ```` -TODO: database migrations... +Now, we can add a new database migration: + +````bash +dotnet ef migrations add Added_Book +```` + +And apply changes to database: + +````bash +dotnet ef database update +```` + +At this point, you should see the Books table if you check your database: + +![book-database-table](book-database-table.png) + +> As you see, the `Books` table contains more fields than the `Book` entity's property count. Other properties are inherited from the `AuditedAggregateRoot` table. You could inherit from the `BasicAggregateRoot` class if you don't want these properties. + +## Seeding the Database + +ABP's [data seeding](https://docs.abp.io/en/abp/latest/Data-Seeding) system is a great way to add some test data to the database. The following class inserts two books to the `Books` table when I migrate the database: + +````csharp +public class DapperDemoDataSeederContributor : IDataSeedContributor, ITransientDependency +{ + private readonly IRepository _bookRepository; + + public DapperDemoDataSeederContributor(IRepository bookRepository) + { + _bookRepository = bookRepository; + } + + public async Task SeedAsync(DataSeedContext context) + { + if (await _bookRepository.GetCountAsync() > 0) + { + return; + } + + await _bookRepository.InsertAsync( + new Book + { + Name = "1984", + PublishDate = new DateTime(1949, 6, 8), + Price = 19.84f + } + ); + + await _bookRepository.InsertAsync( + new Book + { + Name = "The Hitchhiker's Guide to the Galaxy", + PublishDate = new DateTime(1995, 9, 27), + Price = 42.0f + } + ); + } +} +```` + +After creating the `DapperDemoDataSeederContributor` class, I can re-run the following command: + +````bash +dotnet run --migrate-database +```` + +Now, I can see the records in the database: + +![book-table-data](book-table-data.png) + +Now, all ready to try Dapper to query from the `Books` table. ## Using Dapper Without the Integration Package @@ -80,7 +180,118 @@ dotnet add package Dapper > If your application is layered, then we suggest to add the `Dapper` package to your `EntityFrameworkCore` integration project in your solution. +### Executing a Dapper Query + +I will query from the `Books` table, but I don't want to use the `Book` entity to map the result (because I don't need to all properties). So, I am creating a new class for the query result: +````csharp +public class BookDataView +{ + public Guid Id { get; set; } + public string Name { get; set; } + public float Price { get; set; } +} +```` + +Now, we can use Dapper's `QueryAsync` extension method as shown below: + +````csharp +public class DemoService : ITransientDependency +{ + private readonly IRepository _bookRepository; + + public DemoService(IRepository bookRepository) + { + _bookRepository = bookRepository; + } + + [UnitOfWork] + public virtual async Task> GetListAsync() + { + var database = (await _bookRepository.GetDbContextAsync()).Database; + var dbConnection = database.GetDbConnection(); + var dbTransaction = database.CurrentTransaction?.GetDbTransaction(); + + var queryResult = await dbConnection.QueryAsync( + "SELECT Id, Name, Price FROM Books", + transaction: dbTransaction + ); + + return queryResult.ToList(); + } +} +```` + +Let's examine that class: + +* I am injecting ABP's standard [generic repository](https://docs.abp.io/en/abp/latest/Repositories) service in to the `DemoService` constructor. +* `_bookRepository.GetDbContextAsync()` returns the underlying `DbContext` object of EF Core. We need to have the [Volo.Abp.EntityFrameworkCore](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore) package reference to be able to access that method. If you have created a single-layer solution, the reference does already exists. If you have created a layered solution you may need to manually add this package to the project that contains the `DemoService` class. Because the layered solution isolates the EF Core dependency from rest of the solution. +* Dapper needs a `DbConnection` and a `DbTransaction` object (as optional) to execute a query. We are getting them over the `database` object obtained from the `DbContext`. We suggest to always pass the current `DbTransaction` object while working with Dapper. Because, if there is a database transaction on the same database connection that you execute queries, and you don't pass the transaction object, you get an exception. +* Finally, we can use Dapper's `QueryAsync` extension method to execute the database query. +* Notice that the `GetListAsync` method is made as `virtual` and marked with `UnitOfWork` attribute to enable the [Unit Of Work](https://docs.abp.io/en/abp/latest/Unit-Of-Work) for that method. It ensures the database connection is available in the body of the `GetListAsync` method. + +That's all. You can execute any Dapper operation using the `DbConnection` and `DbTransaction` objects obtained from the `_bookRepository` object. Please refer to Dapper's documentation for other operations. + +> We've obtained the `DbContext` object from a repository. However, a repository is not required to obtain a `DbContext`. Instead, you could inject the `IDbContextProvider` service (`IDbContextProvider` for this demo) and call its `GetDbContextAsync` method. + +## Using the Volo.Abp.Dapper Package + +In the previous section, you saw that you don't need to an ABP integration package to be able to use Dapper in your ABP applications. However, there is an integration package here: [Volo.Abp.Dapper](https://www.nuget.org/packages/Volo.Abp.Dapper). Actually, that package doesn't contain much services. It just provides a convenient base class to create Dapper based repository classes. + +### Installing the Volo.Abp.Dapper Package + +You can use [ABP CLI](https://docs.abp.io/en/abp/latest/CLI#add-package) to easily install ABP packages to your projects. Execute the following command in the folder of `.csproj` you want to install the package: + +```` +abp add-package Volo.Abp.Dapper +```` + +> You can check the [ABP Dapper document](https://docs.abp.io/en/abp/latest/Dapper) for alternative installation options. + +### Creating a Repository Class + +In the `DemoService` example, we have used database objects out of a [repository](https://docs.abp.io/en/abp/latest/Repositories) class. If you want to implement layering your solution and abstracting database operations, it can be better to create a repository class to execute Dapper operations. + +Here, a repository class that executes the same database query: + +````csharp +public class BookRepository : DapperRepository, ITransientDependency +{ + public BookRepository(IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public virtual async Task> GetListAsync() + { + var connection = await GetDbConnectionAsync(); + var queryResult = await connection.QueryAsync( + "SELECT Id, Name, Price FROM Books", + transaction: await GetDbTransactionAsync() + ); + return queryResult.ToList(); + } +} +```` + +Let's examine that class: + +* It inherits from the `DapperRepository` class, which provides useful methods and properties for database operations. It also implements the `IUnitOfWorkEnabled` interface, so ABP makes the database connection (and transaction if requested) available in the method body by implementing dynamic proxies (a.k.a. interception). +* `GetListAsync` method made `virtual`. That's needed to make the interception process working. It wouldn't be needed if we introduce `IBookRepository` for that class and always use it by injecting the `BookRepository` class (in this case, it will use interface proxying - however, this is too much details for the purpose of this article). +* We are using the `GetDbConnectionAsync` and `GetDbTransactionAsync` methods to obtain the current database connection and transaction (that is managed by ABP's [unit of work](https://docs.abp.io/en/abp/latest/Unit-Of-Work) system). + +You can then inject the `BookRepository` class when you want to get a list of `BookDataView` whenever it is needed. In the demo project, I used it inside the `IndexModel.cshtml.cs` to show a list of books on the page: + +![list-of-books](list-of-books.png) + +## Conclusion + +In this article, I've explained ABP's Dapper integration and demonstrated how you can execute Dapper operations in your applications. I suggest to use Dapper when it is really needed and adds any significant value (generally a performance gain) to your application. Otherwise, EF Core is much more convenient for most of the database operations and you will have a more maintainable codebase using EF Core. + +## Source Code + +You can find the [full source code of the demo application here](https://github.com/abpframework/abp-samples/tree/master/Dapper). -s +## See Also +* [ABP Dapper documentation](https://docs.abp.io/en/abp/latest/Dapper) diff --git a/docs/en/Community-Articles/2023-03-20-Dapper/book-class-in-rider.png b/docs/en/Community-Articles/2023-03-20-Dapper/book-class-in-rider.png new file mode 100644 index 0000000000000000000000000000000000000000..db1e5791b4e9531406a19314749dcbfa16514e82 GIT binary patch literal 8029 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 GgZ>u}*>^|) literal 0 HcmV?d00001 diff --git a/docs/en/Community-Articles/2023-03-20-Dapper/list-of-books.png b/docs/en/Community-Articles/2023-03-20-Dapper/list-of-books.png new file mode 100644 index 0000000000000000000000000000000000000000..23b190afa640204eaefd766040d5b05c704bcd01 GIT binary patch literal 9642 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