Hoang  Kim

Hoang Kim

1659363540

Sử Dụng Entity Framework Core và Dapper trong ASP.NET Core

Trong bài viết này, chúng ta sẽ tìm hiểu về cách sử dụng Entity Framework Core và Dapper trong ASP.NET Core cùng nhau trong cùng một ứng dụng. Một điểm chính khác của cuộc thảo luận sẽ là Giao dịch. Đến cuối bài viết, chúng ta sẽ có một ứng dụng hoạt động với cả Entity Framework Core và Dapper song song với nhau, nhưng cũng đủ thông minh để khôi phục dữ liệu bất cứ khi nào có ngoại lệ với quy trình.

Bắt đầu nào!

Dapper vs Entity Framework Core

Dapper thực sự nhanh hơn nhiều so với Entity Framework Core xét trên thực tế là không có chuông và còi trong Dapper. Nó là một Micro ORM chuyển tiếp cũng có các tính năng tối thiểu. Nhà phát triển luôn có quyền lựa chọn giữa 2 Công nghệ Truy cập Dữ liệu Tuyệt vời này. Điều này không có nghĩa là Entity Framework Core chậm hơn. Với mỗi bản cập nhật, hiệu suất dường như cũng được cải thiện. Dapper là thiên đường cho những ai vẫn thích làm việc với Truy vấn RAW hơn là LINQ với EFCore.

Giờ đây, Entity Framework Core có rất nhiều tính năng đi kèm cùng với các cải tiến về hiệu suất. Vì vậy, câu hỏi đặt ra là, Tại sao lại chọn giữa Dapper và Entity Framework Core khi bạn có thể sử dụng cả hai và tận dụng tối đa lợi ích, đúng vậy?

Dapper là siêu tuyệt vời để xử lý các truy vấn phức tạp có nhiều phép nối và một số logic nghiệp vụ thực sự dài. Entity Framework Core rất tuyệt vời để tạo lớp, theo dõi đối tượng, ánh xạ tới nhiều lớp lồng nhau và hơn thế nữa. Vì vậy, nó thường là Hiệu suất và Tính năng khi nói về 2 ORM này.

Yêu cầu

Chúng tôi sẽ thiết kế một ASP.NET Core WebAPI đơn giản cho một Công ty tưởng tượng. Công ty này có một chính sách nói rằng mọi Nhân viên khác phải được liên kết với một Bộ phận duy nhất. Để rõ ràng hơn, mỗi khi bạn thêm một nhân viên mới thông qua điểm cuối API, bạn cũng phải tạo Hồ sơ phòng ban mới. Một yêu cầu rất tưởng tượng, phải không? Cùng với điều này, chúng ta sẽ có 2 điểm cuối khác trả về tất cả Nhân viên và Nhân viên theo Id.

Mở rộng chi tiết, chúng tôi sẽ phải đảm bảo rằng Bộ phận mới được thêm vào chưa tồn tại. Bạn sẽ nắm được điều này khi bạn nhìn thấy các Đối tượng miền.

Để chứng minh việc sử dụng Dapper, Entity Framework Core và cả hai được kết hợp, chúng tôi sẽ triển khai chúng trong 3 Endpoints. Đối với các Điểm cuối GetAll, chúng tôi sẽ sử dụng Dapper. Điểm cuối GetById sẽ sử dụng Lõi khung thực thể với tính năng Tải hứng thú để hiển thị cả Chi tiết phòng ban. Và cuối cùng, POST Endpoint sẽ tận dụng lợi thế của cả hai Công nghệ Truy cập Dữ liệu tuyệt vời này và Các Giao dịch Chứng minh Sạch sẽ trong ASP.NET Core.

Trong quá trình này, chúng tôi sẽ giới thiệu một số Thư viện cho ASP.NET Core có thể giúp bạn tiết kiệm thời gian phát triển.

Các khía cạnh quan trọng cần xử lý - Giao dịch

Bây giờ, theo yêu cầu của chúng tôi, chúng tôi cần cả Entity Framework Core và Dapper để làm việc cùng nhau. Điều này thực sự khá dễ dàng để đạt được. Nhưng chi tiết quan trọng cần lưu ý là chúng ta cần đảm bảo rằng cả Entity Framework Core và Dapper đều phải tham gia vào cùng một Giao dịch DB để quá trình tổng thể có thể được mạnh mẽ.

Ví dụ, một Thao tác Viết cụ thể có thể liên quan đến nhiều thực thể và bảng. Điều này đến lượt nó có thể có các hoạt động dễ dàng được xử lý bởi Entity Framework Core, và giả sử một loạt các Truy vấn phức tạp được thực thi bởi Dapper. Trong những trường hợp như vậy, chúng tôi phải đảm bảo rằng có thể khôi phục hoạt động SQL Execute khi bất kỳ hoạt động / truy vấn nào không thành công. Có ý nghĩa? Đây là khía cạnh có thể gây ra một sự phức tạp nhỏ cho thiết kế hệ thống của chúng tôi.

Nếu chúng ta không xem xét điều này, quá trình tổng thể sẽ rất đơn giản. Hãy để tôi đưa ý tưởng thành các bước.
1. Cấu hình Core Framework thực thể.
2. Cấu hình Dapper. Bạn có thể đạt được điều này bằng cách sử dụng cùng một chuỗi kết nối đang được sử dụng bởi EFCore. (Rõ ràng là từ appsettings.json)
3. Đăng ký các dịch vụ vào Container và bắt đầu sử dụng Context / Dapper theo yêu cầu.

Nhưng chúng tôi sẽ tìm kiếm một cơ chế phức tạp hơn và bền vững hơn trong tương lai, sẽ xử lý thực sự mọi thứ, bao gồm cả Rollbacks và Giao dịch. Hiểu rồi?

Sử dụng Entity Framework Core và Dapper trong ASP.NET Core

Thiết lập Giải pháp và Dự án

Chúng tôi sẽ làm theo một Kiến trúc Hành như thường lệ để tạo thành một sự tách biệt rõ ràng về các mối quan tâm. Đầu tiên, hãy mở Visual Studio 2019 và tạo giải pháp trống mới. Ở đây chúng ta sẽ thêm 4 Project mới là Domain, Persistence và WebApi. Miền và Dự án bền vững là Thư viện Lớp lõi .NET trong khi WebApi là Ứng dụng Web ASP.NET Core 3.1 với Mẫu API được chọn.

Dự án miền sẽ chỉ bao gồm các Thực thể và Giao diện Miền cốt lõi. Lớp Kiên trì nên có việc Triển khai các Giao diện, Dịch vụ và mọi thứ liên quan đến Core và Dapper của Entity Framework. Cuối cùng, Dự án WebApi sẽ có các Điểm cuối API.

Xin lưu ý rằng đây là một triển khai rất tối thiểu của Kiến trúc Hành tây / Lục giác. Để có hướng dẫn chi tiết hơn về Kiến trúc, hãy tham khảo bài viết này - Kiến trúc củ hành trong ASP.NET Core với CQRS - Chi tiết

Xây dựng dựa trên các chi tiết mà bạn đã học được từ bài viết trên, đây là cách triển khai đầy đủ của Kiến trúc sạch trong ASP.NET Core WebAPI có sẵn dưới dạng Mẫu bảng trình bày giúp bạn bắt đầu nhanh chóng - ASP.NET Core WebAPI - Kiến trúc sạch ( Dự án nguồn mở)

Bây giờ, hãy bắt đầu cài đặt tất cả các gói cần thiết cho mỗi dự án.

Các gói cho dự án miền

Rõ ràng là Dự án miền KHÔNG BAO GIỜ phụ thuộc vào bất kỳ thứ gì khác. Nhưng vì chúng ta đang kết hợp cả lớp Miền và lớp Ứng dụng thành một thực thể duy nhất và vì lý do để giữ cho mọi thứ đơn giản, hãy cài đặt 2 gói này qua Dự án Miền.

Install-Package Microsoft.EntityFrameworkCore

Các gói cho Dự án bền vững

Như đã đề cập trước đó, mọi thứ liên quan đến Cơ sở hạ tầng / Tính bền vững của Giải pháp sẽ được đặt trong Dự án này. Hãy tiếp tục và cài đặt các gói sau vào Dự án bền bỉ.

Install-Package Dapper
Install-Package Microsoft.EntityFrameworkCore.Design
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Relational
Install-Package System.Data.SqlClient

Các gói cho Dự án WebApi

Cuối cùng, thêm các gói này vào Dự án WebAPI.

Install-Package Microsoft.EntityFrameworkCore.Tools

Thêm các thực thể miền

Điều hướng đến Dự án miền và tạo Thực thể thư mục mới và thêm 2 lớp này vào đó, Nhân viên và Phòng ban.

namespace Domain.Entities
{
public class Department
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
}
using AspNetCoreHero.Abstractions;
namespace Domain.Entities
{
public class Employee : BaseEntity
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public int DepartmentId { get; set; }
public Department Department { get; set; }
}
}

Thiết kế giao diện

Một lần nữa, trong Dự án miền, hãy thêm một thư mục khác, Giao diện. Ở đây đang sử dụng khái niệm Đảo ngược phụ thuộc, để hệ thống không quan tâm đến việc thực hiện và chỉ chịu trách nhiệm cung cấp Hợp đồng theo những gì nó thực sự muốn. Với cách tiếp cận này, sẽ dễ dàng hơn trong việc thiết kế các hệ thống sạch sẽ và đơn giản, rất lý tưởng cho việc Thử nghiệm. Theo cách này, Cốt lõi của Giải pháp không phụ thuộc vào bất kỳ thứ gì như Entity Framework hay Dapper, thay vào đó, nó giúp chúng ta dễ dàng chuyển sang các công nghệ khác nhau.

Hãy thêm Giao diện đầu tiên của chúng ta, IApplicationDbContext.cs, giao diện này có nghĩa là được triển khai tại Lớp Persistence bằng cách sử dụng Entity Framework Core.

public interface IApplicationDbContext
{
public IDbConnection Connection { get; }
DatabaseFacade Database { get; }
public DbSet<Employee> Employees { get; set; }
public DbSet<Department> Departments { get; set; }
Task<int> SaveChangesAsync(CancellationToken cancellationToken);
}

Ở đây bạn có thể thấy rằng chúng tôi đang sử dụng 2 thuộc tính mới là IDbConnection và DbFacade. Đây chỉ là cách truy cập trực tiếp vào Cơ sở dữ liệu sẽ được Dapper sử dụng sau này. Hãy nhớ rằng, chúng ta đã nói về việc làm cho cả EFCore và Dapper hoạt động song song với nhau?

Tiếp theo, hãy thêm 2 giao diện khác dành riêng cho Đọc và Viết. Giao diện Đọc sẽ có các hợp đồng để chỉ chạy các Truy vấn dựa trên cơ sở dữ liệu. trong khi Giao diện Viết sẽ là gói hoàn chỉnh.

Lưu ý rằng chúng tôi cũng đang sử dụng IDbTransaction sẽ rất hữu ích khi chúng tôi bắt đầu xử lý các Giao dịch ở phần sau của bài viết này.

public interface IApplicationReadDbConnection
{
Task<IReadOnlyList<T>> QueryAsync<T>(string sql, object param = null, IDbTransaction transaction = null, CancellationToken cancellationToken = default);
Task<T> QueryFirstOrDefaultAsync<T>(string sql, object param = null, IDbTransaction transaction = null, CancellationToken cancellationToken = default);
Task<T> QuerySingleAsync<T>(string sql, object param = null, IDbTransaction transaction = null, CancellationToken cancellationToken = default);
}
public interface IApplicationWriteDbConnection : IApplicationReadDbConnection
{
Task<int> ExecuteAsync(string sql, object param = null, IDbTransaction transaction = null, CancellationToken cancellationToken = default);
}

Đó là hầu hết mọi thứ chúng ta cần làm với Dự án miền. Hãy bắt đầu triển khai ngay bây giờ.

Thiết lập EntityFrameworkCore

Trong Dự án Kiên trì, hãy thêm một Khung cảnh thư mục mới và thêm vào tệp ApplicationDbContext.cs.

public class ApplicationDbContext : DbContext, IApplicationDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
}
public DbSet<Employee> Employees { get; set; }
public DbSet<Department> Departments { get; set; }
public IDbConnection Connection => Database.GetDbConnection();
}

Bạn có thể thấy rằng, tại Dòng 8, chúng tôi đang trích xuất đối tượng Connection từ cá thể Entity Framework Core.

Để tìm hiểu chi tiết về Entity Framework Core, vui lòng tham khảo bài viết sau - Entity Framework Core trong ASP.NET Core 3.1 - Bắt đầu

Thiết lập Dapper

Bây giờ, trong dự án Persistence, hãy thêm một thư mục khác và đặt tên là Connections. Cả hai đều là Giao diện Đọc và Ghi sẽ được thực hiện tại đây. Thêm các lớp sau.

public class ApplicationReadDbConnection : IApplicationReadDbConnection, IDisposable
{
private readonly IDbConnection connection;
public ApplicationReadDbConnection(IConfiguration configuration)
{
connection = new SqlConnection(configuration.GetConnectionString("DefaultConnection"));
}
public async Task<IReadOnlyList<T>> QueryAsync<T>(string sql, object param = null, IDbTransaction transaction = null, CancellationToken cancellationToken = default)
{
return (await connection.QueryAsync<T>(sql, param, transaction)).AsList();
}
public async Task<T> QueryFirstOrDefaultAsync<T>(string sql, object param = null, IDbTransaction transaction = null, CancellationToken cancellationToken = default)
{
return await connection.QueryFirstOrDefaultAsync<T>(sql, param, transaction);
}
public async Task<T> QuerySingleAsync<T>(string sql, object param = null, IDbTransaction transaction = null, CancellationToken cancellationToken = default)
{
return await connection.QuerySingleAsync<T>(sql, param, transaction);
}
public void Dispose()
{
connection.Dispose();
}
}

Đảm bảo rằng bạn cũng đang triển khai giao diện IDisposible.

Tại hàm tạo, bạn có thể thấy rằng chúng tôi đang khởi tạo một Kết nối mới bằng cách sử dụng chuỗi kết nối từ appSettings.json của chúng tôi. Lưu ý rằng trong cách triển khai này, không có liên kết nào với bất kỳ đối tượng DBContext nào (Entity Framework Core) vì thực sự không có ý nghĩa khi chia sẻ kết nối giữa Entity Framework Core và Dapper khi bạn đang đọc dữ liệu.

Trường hợp sử dụng của việc chia sẻ kết nối sẽ thành hình khi có liên quan đến việc ghi dữ liệu. Hãy xem nó được thực hiện như thế nào.

public class ApplicationWriteDbConnection : IApplicationWriteDbConnection
{
private readonly IApplicationDbContext context;
public ApplicationWriteDbConnection(IApplicationDbContext context)
{
this.context = context;
}
public async Task<int> ExecuteAsync(string sql, object param = null, IDbTransaction transaction = null, CancellationToken cancellationToken = default)
{
return await context.Connection.ExecuteAsync(sql, param, transaction);
}
public async Task<IReadOnlyList<T>> QueryAsync<T>(string sql, object param = null, IDbTransaction transaction = null, CancellationToken cancellationToken = default)
{
return (await context.Connection.QueryAsync<T>(sql, param, transaction)).AsList();
}
public async Task<T> QueryFirstOrDefaultAsync<T>(string sql, object param = null, IDbTransaction transaction = null, CancellationToken cancellationToken = default)
{
return await context.Connection.QueryFirstOrDefaultAsync<T>(sql, param, transaction);
}
public async Task<T> QuerySingleAsync<T>(string sql, object param = null, IDbTransaction transaction = null, CancellationToken cancellationToken = default)
{
return await context.Connection.QuerySingleAsync<T>(sql, param, transaction);
}
}

Trong quá trình viết được triển khai, chúng tôi thực sự có một triển khai Kết nối toàn diện với cả Chức năng Đọc và Ghi. Bạn cũng có thể tránh Chức năng Đọc. Nhưng nó phụ thuộc vào sở thích của bạn.

Bạn có thể thấy rằng chúng tôi đang đưa IApplicationDbContext thuộc Entity Framework vào Constructor. Đây là cách chúng ta có thể chia sẻ kết nối và giao dịch. Sử dụng kết nối của ngữ cảnh, chúng tôi thực hiện các thao tác đọc và ghi bằng Dapper. Khá tuyệt, phải không?

Trong phần triển khai Read, chúng tôi đã trực tiếp làm việc với đối tượng IDbConnection mà chúng tôi đã khởi tạo trong phương thức khởi tạo bằng cách sử dụng chuỗi kết nối. Trong khi, ở đây trong phần triển khai Write, chúng ta đang sử dụng lại đối tượng ngữ cảnh để thực hiện các truy vấn và lệnh với sự trợ giúp của Dapper.

Để tìm hiểu chi tiết về Dapper, vui lòng tham khảo bài viết sau - Dapper trong ASP.NET Core với Mẫu kho lưu trữ - Chi tiết

Thêm chuỗi kết nối

Mở appsettings.json của bạn và thêm chuỗi kết nối của bạn.

"ConnectionStrings": {
"DefaultConnection": "Data Source=LAPTOP-7CS9KHVQ;Initial Catalog=demoDb;Integrated Security=True;MultipleActiveResultSets=True"
},

Đăng ký Dịch vụ

Cuối cùng, hãy đăng ký các giao diện và lớp này vào vùng chứa dịch vụ của Ứng dụng Web ASP.NET Core của chúng ta. Mở Startup.cs của bạn trong Dự án WebAPI và sửa đổi ConfigureServices của bạn như sau.

public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options
.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))
);
services.AddScoped<IApplicationDbContext>(provider => provider.GetService<ApplicationDbContext>());
services.AddScoped<IApplicationWriteDbConnection, ApplicationWriteDbConnection>();
services.AddScoped<IApplicationReadDbConnection, ApplicationReadDbConnection>();
services.AddControllers();
}

Thêm di chuyển và cập nhật cơ sở dữ liệu

Nhấp chuột phải vào Dự án WebAPI và đảm bảo rằng nó được đặt làm Dự án Khởi động của giải pháp. Tiếp theo, mở Bảng điều khiển Trình quản lý Gói và đặt dự án mặc định thành Infrastrcture từ menu thả xuống.

Nhập thông tin sau để thêm di chuyển và cập nhật cơ sở dữ liệu với Bảng Nhân viên và Bộ phận.

add-migration initial
update-database

Nối dây với Bộ điều khiển

Vì chúng ta đã thực hiện tất cả các công việc nặng nhọc, hãy xây dựng bộ điều khiển của chúng ta với 3 điểm cuối đã đề cập. Thêm Bộ điều khiển mới trong thư mục Bộ điều khiển và đặt tên là Bộ điều khiển nhân viên.

Hãy đưa tất cả 3 giao diện mà chúng ta đã tạo trước đó vào Constructor của Controller. Lý tưởng nhất là bạn nên sử dụng Lớp dịch vụ hoặc Mẫu CQRS để thực hiện việc này. Nhưng một lần nữa, để giữ cho mọi thứ đơn giản, chúng tôi sẽ khai báo Tiêm ở đây.

Nếu bạn muốn tìm hiểu về Triển khai CQRS trong ASP.NET Core với thư viện MediatR, hãy tham khảo bài viết chi tiết này - CQRS với MediatR trong ASP.NET Core 3.1 - Hướng dẫn cuối cùng

public EmployeeController(IApplicationDbContext dbContext, IApplicationReadDbConnection readDbConnection, IApplicationWriteDbConnection writeDbConnection)
{
_dbContext = dbContext;
_readDbConnection = readDbConnection;
_writeDbConnection = writeDbConnection;
}
public IApplicationDbContext _dbContext { get; }
public IApplicationReadDbConnection _readDbConnection { get; }
public IApplicationWriteDbConnection _writeDbConnection { get; }

Hãy bắt đầu với các điểm cuối theo yêu cầu của chúng tôi.

Nhận tất cả nhân viên

Đầu tiên là một điểm cuối đơn giản sẽ trả về tất cả các Nhân viên có sẵn từ cơ sở dữ liệu. Chúng tôi sẽ sử dụng Dapper cho việc này, do đó chúng tôi sẽ sử dụng _readDbConnection, có lý không?

[HttpGet]
public async Task<IActionResult> GetAllEmployees()
{
var query = $"SELECT * FROM Employees";
var employees = await _readDbConnection.QueryAsync<Employee>(query);
return Ok(employees);
}

Trước khi thực thi, hãy để tôi thêm một số dữ liệu giả vào bảng của chúng tôi.

Sau khi dữ liệu được thêm vào, hãy chạy ứng dụng của chúng tôi và mở POSTMAN . Gửi yêu cầu GET đến điểm cuối api / nhân viên. Thao tác này sẽ trả về danh sách các nhân viên có sẵn từ cơ sở dữ liệu. Hãy nhớ điều này là của Dapper. Thời gian thực thi Truy vấn luôn có nghĩa là tốt hơn nhiều so với các ORM khác. Nhưng điểm chính cần lưu ý là lý tưởng nhất là dapper trả về dữ liệu ở mức phẳng. Nó không đủ mạnh để lấp đầy các đối tượng lồng vào nhau. Bạn có thể thấy rằng Bộ là NULL.

Điều đó đang được nói, bạn vẫn có thể đạt được điều này bằng Dapper nhưng bằng cách thêm nhiều mã hơn bạn tưởng tượng., Có thể bằng nhiều truy vấn. Đây là Margin nơi bạn phải chọn giữa Dapper và Entity Framework Core. Mặt khác, EFCore có thể thực hiện điều này mà thực sự không cần thêm mã. Chúng ta sẽ xem về nó trong Endpoint tiếp theo.

dapper getAll Sử dụng Entity Framework Core và Dapper trong ASP.NET Core - Giao dịch an toàn

Nhận nhân viên theo Id

Hãy thêm một điểm cuối có thể trả về một Nhân viên dựa trên Id. Chúng tôi sẽ sử dụng đối tượng _dbContext cho điểm cuối này. Chúng tôi cũng đang giới thiệu Eager Loading bằng Entity Framework Core có thể điền vào đối tượng con lồng nhau một cách dễ dàng.

[HttpGet("{id}")]
public async Task<IActionResult> GetAllEmployeesById(int id)
{
var employees = await _dbContext.Employees.Include(a => a.Department).Where(a => a.Id == id).ToListAsync();
return Ok(employees);
}

efcore getById Sử dụng Entity Framework Core và Dapper trong ASP.NET Core - Giao dịch an toàn

Bây giờ bạn có thể thấy rằng chúng tôi cũng đang nhận được thông tin chi tiết về Bộ.

Tạo nhân viên và phòng ban trong một lần

Cuối cùng, hãy làm việc trên một điểm cuối phức tạp hơn một chút. Đây là công thức algortihm theo yêu cầu.

  1. Chấp nhận một Lớp DTO có chứa dữ liệu của Nhân viên mới và Bộ phận mới dưới dạng các tham số
  2. Đảm bảo rằng bạn đang sử dụng cùng một Giao dịch và Lõi khung Dapper / Thực thể
  3. Kiểm tra xem tên Bộ đã tồn tại chưa. Ném một ngoại lệ nếu bộ phận tồn tại.
  4. Chèn chi tiết phòng ban vào Bảng phòng ban.
  5. Trả lại ID phòng ban
  6. Chèn chi tiết Nhân viên vào bảng Nhân viên cùng với Id bộ phận đã tạo.
  7. Trả lại Id nhân viên và thực hiện giao dịch
  8. Nếu bất kỳ thao tác nào ở trên không thành công hoặc có ngoại lệ, hãy khôi phục giao dịch và đảm bảo rằng db không bị ảnh hưởng.

Vì vậy, đó là về yêu cầu chi tiết. Hãy thêm các Lớp DTO. Trong Dự án WebAPI, hãy thêm một thư mục mới, DTO và thêm vào các lớp sau.

public class DepartmentDto
{
[Required]
public string Name { get; set; }
public string Description { get; set; }
}
public class EmployeeDto
{
[Required]
public string Name { get; set; }
[Required]
public string Email { get; set; }
[Required]
public DepartmentDto Department { get; set; }
}
Next, in the Employee Controller add in the following.
[HttpPost]
public async Task<IActionResult> AddNewEmployeeWithDepartment(EmployeeDto employeeDto)
{
_dbContext.Connection.Open();
using (var transaction = _dbContext.Connection.BeginTransaction())
{
try
{
_dbContext.Database.UseTransaction(transaction as DbTransaction);
//Check if Department Exists (By Name)
bool DepartmentExists = await _dbContext.Departments.AnyAsync(a => a.Name == employeeDto.Department.Name);
if(DepartmentExists)
{
throw new Exception("Department Already Exists");
}
//Add Department
var addDepartmentQuery = $"INSERT INTO Departments(Name,Description) VALUES('{employeeDto.Department.Name}','{employeeDto.Department.Description}');SELECT CAST(SCOPE_IDENTITY() as int)";
var departmentId = await _writeDbConnection.QuerySingleAsync<int>(addDepartmentQuery, transaction: transaction);
//Check if Department Id is not Zero.
if(departmentId == 0)
{
throw new Exception("Department Id");
}
//Add Employee
var employee = new Employee
{
DepartmentId = departmentId,
Name = employeeDto.Name,
Email = employeeDto.Email
};
await _dbContext.Employees.AddAsync(employee);
await _dbContext.SaveChangesAsync(default);
//Commmit
transaction.Commit();
//Return EmployeeId
return Ok(employee.Id);
}
catch (Exception)
{
transaction.Rollback();
throw;
}
finally
{
_dbContext.Connection.Close();
}
}
}

Vì vậy, ý tưởng là đơn giản. Mở Kết nối, Tạo đối tượng giao dịch. Sử dụng giao dịch này trên lõi và dapper của khung Entity. Nếu bất kỳ hoạt động nào không thành công, hãy khôi phục các giao dịch để đảm bảo rằng không có dữ liệu bị lỗi. Nếu không có ngoại lệ, hãy thực hiện giao dịch và cuối cùng đóng kết nối.

Dòng 4 - Mở kết nối
Dòng 5 - Tạo / Bắt đầu Giao dịch thông qua đối tượng _dbContext.
Dòng 9 - Gán đối tượng giao dịch này cho Cơ sở dữ liệu.
Dòng 11 - Kiểm tra xem bộ phận đã nhập có tồn tại hay không.

Dòng 18 - Thực hiện Truy vấn Chèn bằng _writeDbConnection (Dapper) và trả về Id đã thêm. Lưu ý rằng chúng tôi cũng đang sử dụng đối tượng giao dịch ở đây.

Dòng 25 - Bây giờ chúng ta đã có Id Bộ phận hợp lệ, hãy tạo một đối tượng Nhân viên và điền vào nó với dữ liệu cần thiết.
Dòng 31 - Thêm đối tượng vào thể hiện dbContext.
Dòng 32 - Cuối cùng lưu các thay đổi.
Dòng 34 - Thực hiện giao dịch. Khi kiểm soát chạm đến dòng này, điều đó có nghĩa là chúng tôi không gặp phải trường hợp ngoại lệ nào và có thể an toàn khi thực hiện giao dịch.
Dòng 36- Trả về Id Nhân viên mới được tạo.

Dòng 40 - Nếu có một ngoại lệ, tất cả các thay đổi cơ sở dữ liệu sẽ được khôi phục lại để duy trì dữ liệu sạch. Đây là việc sử dụng thực tế của các giao dịch.
Dòng 45 - Cuối cùng đóng các kết nối.

Với lời giải thích rõ ràng, chúng ta hãy thực sự xem đoạn mã đang hoạt động. Sau đây sẽ là Yêu cầu của tôi trên POSTMAN đến Điểm cuối POST của Bộ điều khiển nhân viên.

{
"name": "Mukesh Murugan",
"email": "mukesh@google.es",
"department": {
"name" : "Development",
"description" : "Development department"
}
}

Bây giờ, chúng ta đã biết rằng Bộ có Tên phát triển không tồn tại trong cơ sở dữ liệu. Hãy gửi yêu cầu.

giao dịch ĐĂNG Sử dụng Core và Dapper của Entity Framework trong ASP.NET Core - Giao dịch an toàn

Bạn có thể thấy hoạt động đã hoàn thành và trả về ID của nhân viên mới được thêm vào. Hãy kiểm tra Điểm cuối GetById của chúng tôi bằng cách sử dụng ID này.

giao dịch được thêm vào Sử dụng Entity Framework Core và Dapper trong ASP.NET Core - Giao dịch an toàn

Bạn có thể thấy rằng bản ghi được tạo trong cả bảng Nhân viên và Bộ phận khi chúng tôi cần. Vì vậy, đó thực sự là cách dễ dàng để sử dụng Entity Framework Core và Dapper trong cùng một ứng dụng ASP.NET Core trong cùng một giao dịch.

Bây giờ điều gì sẽ xảy ra khi chúng tôi gửi lại Yêu cầu ĐĂNG với cùng một nội dung yêu cầu?

Giao dịch Lỗi khi sử dụng Entity Framework Core và Dapper trong ASP.NET Core - Giao dịch an toàn

Tái bút, bạn có thể thấy một thông báo khác trong POSTMAN, vì tôi đang sử dụng một gói khác trong khi phát triển.

Đó là một kết thúc cho bài viết này. Tôi hy vọng rằng nó đã giải tỏa khá nhiều nghi ngờ và mở ra một cách tiếp cận mạnh mẽ để Sử dụng Entity Framework Core và Dapper trong ASP.NET Core xử lý các Giao dịch.

Bản tóm tắt

Trong bài viết chi tiết này, chúng ta đã tìm hiểu về một cách tiếp cận thực sự đơn giản và mạnh mẽ để tận dụng hai ORM mạnh mẽ nhất cho ASP.NET Core, đó là Entity Framework Core và Dapper. Ngoài ra, chúng tôi đã nói về Giao dịch và xây dựng một ứng dụng có thể sử dụng cả ORM để lưu ý các giao dịch. Do đó, chúng tôi có một ứng dụng đủ thông minh để khôi phục các thay đổi nếu có bất kỳ ngoại lệ nào xảy ra trong quá trình này.

Bạn có thể tìm thấy toàn bộ mã nguồn của việc triển khai tại đây.

Hãy để lại những thắc mắc, gợi ý có giá trị của bạn trong phần bình luận bên dưới. Ngoài ra, nếu bạn nghĩ rằng bạn đã học được điều gì đó mới từ bài viết này, đừng quên chia sẻ điều này trong cộng đồng nhà phát triển của bạn. Chúc bạn mã hóa vui vẻ!

Nguồn: https://codewithmukesh.com/blog/using-entity-framework-core-and-dapper/

   #entityframework 

What is GEEK

Buddha Community

Sử Dụng Entity Framework Core và Dapper trong ASP.NET Core
Einar  Hintz

Einar Hintz

1602560783

jQuery Ajax CRUD in ASP.NET Core MVC with Modal Popup

In this article, we’ll discuss how to use jQuery Ajax for ASP.NET Core MVC CRUD Operations using Bootstrap Modal. With jQuery Ajax, we can make HTTP request to controller action methods without reloading the entire page, like a single page application.

To demonstrate CRUD operations – insert, update, delete and retrieve, the project will be dealing with details of a normal bank transaction. GitHub repository for this demo project : https://bit.ly/33KTJAu.

Sub-topics discussed :

  • Form design for insert and update operation.
  • Display forms in modal popup dialog.
  • Form post using jQuery Ajax.
  • Implement MVC CRUD operations with jQuery Ajax.
  • Loading spinner in .NET Core MVC.
  • Prevent direct access to MVC action method.

Create ASP.NET Core MVC Project

In Visual Studio 2019, Go to File > New > Project (Ctrl + Shift + N).

From new project window, Select Asp.Net Core Web Application_._

Image showing how to create ASP.NET Core Web API project in Visual Studio.

Once you provide the project name and location. Select Web Application(Model-View-Controller) and uncheck HTTPS Configuration. Above steps will create a brand new ASP.NET Core MVC project.

Showing project template selection for .NET Core MVC.

Setup a Database

Let’s create a database for this application using Entity Framework Core. For that we’ve to install corresponding NuGet Packages. Right click on project from solution explorer, select Manage NuGet Packages_,_ From browse tab, install following 3 packages.

Showing list of NuGet Packages for Entity Framework Core

Now let’s define DB model class file – /Models/TransactionModel.cs.

public class TransactionModel
{
    [Key]
    public int TransactionId { get; set; }

    [Column(TypeName ="nvarchar(12)")]
    [DisplayName("Account Number")]
    [Required(ErrorMessage ="This Field is required.")]
    [MaxLength(12,ErrorMessage ="Maximum 12 characters only")]
    public string AccountNumber { get; set; }

    [Column(TypeName ="nvarchar(100)")]
    [DisplayName("Beneficiary Name")]
    [Required(ErrorMessage = "This Field is required.")]
    public string BeneficiaryName { get; set; }

    [Column(TypeName ="nvarchar(100)")]
    [DisplayName("Bank Name")]
    [Required(ErrorMessage = "This Field is required.")]
    public string BankName { get; set; }

    [Column(TypeName ="nvarchar(11)")]
    [DisplayName("SWIFT Code")]
    [Required(ErrorMessage = "This Field is required.")]
    [MaxLength(11)]
    public string SWIFTCode { get; set; }

    [DisplayName("Amount")]
    [Required(ErrorMessage = "This Field is required.")]
    public int Amount { get; set; }

    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime Date { get; set; }
}

C#Copy

Here we’ve defined model properties for the transaction with proper validation. Now let’s define  DbContextclass for EF Core.

#asp.net core article #asp.net core #add loading spinner in asp.net core #asp.net core crud without reloading #asp.net core jquery ajax form #asp.net core modal dialog #asp.net core mvc crud using jquery ajax #asp.net core mvc with jquery and ajax #asp.net core popup window #bootstrap modal popup in asp.net core mvc. bootstrap modal popup in asp.net core #delete and viewall in asp.net core #jquery ajax - insert #jquery ajax form post #modal popup dialog in asp.net core #no direct access action method #update #validation in modal popup

Hertha  Mayer

Hertha Mayer

1602668764

Announcing Entity Framework Core (EF Core) 5 RC2

Today, the Entity Framework Core team announces the second release candidate (RC2) of EF Core 5.0. This is a feature complete release candidate of EF Core 5.0 and ships with a “go live” license. You are supported using it in production. This is a great opportunity to start using EF Core 5.0 early while there is still time to fix remaining issues. We’re looking for reports of any remaining critical bugs that should be fixed before the final release.

Prerequisites

EF Core 5.0 will not run on .NET Standard 2.0 platforms, including .NET Framework.

How to get EF Core 5.0 Release Candidate 2

EF Core is distributed exclusively as a set of NuGet packages. For example, to add the SQL Server provider to your project, you can use the following command using the dotnet tool:

dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 5.0.0-rc.2.20475.6

#.net #.net core #.net framework #asp.net #c# #entity framework #announcement #asp.net core #entity framework core

Einar  Hintz

Einar Hintz

1602564619

MVC User Registration & Login with ASP.NET Core Identity

User registration and authentication are mandatory in any application when you have little concern about privacy. Hence all most all application development starts with an authentication module. In this article, we will discuss the quickest way to use **ASP.NET Core Identity for User Login and Registration **in a new or existing MVC application.

Sub-topics discussed :

  • How to add ASP.NET Core Identity to MVC application.
  • Customize ASP.NET Core Identity.
  • Identity.UI Design Customization.
  • Next step.

Background

ASP.NET Core Identity is an API, which provides both user interface(UI) and functions for user authentication, registration, authorization, etc. Modules/ APIs like this will really be helpful and fasten the development process. It comes with ASP.NET Core Framework and used in many applications before. Which makes the API more dependable and trustworthy.

ASP.NET Core MVC with user authentication can easily be accomplished using Identity.UI. While creating the MVC project, you just need to select Authentication as Individual User Accounts.

Showing how to create an MVC application with ASP.NET Core Identity API

The rest will be handled by ASP.NET Core Identity UI. It already contains razor view pages and backend codes for an authentication system. But that’s not what we want in most of the cases. we want to customize ASP.NET Core Identity as per our requirement. That’s what we do here.

Create an ASP.NET Core MVC Project

First of all, I will create a brand new ASP.NET Core MVC application without any authentication selected. We could add ASP.NET Core Identity later into the project.

In Visual Studio 2019, Go to File > New > Project (Ctrl + Shift + N). From new project window, select ASP.NET Core Web Application.

Create an ASP.NET Core Web application

Once you provide the project name and location. A new window will be opened as follows, Select _Web Application(Model-View-Controller), _uncheck _HTTPS Configuration _and DO NOT select any authentication method. Above steps will create a brand new ASP.NET Core MVC project.

Select Model View Controller templet under .NET Core

#asp.net core article #asp.net core #add asp.net core identity to existing project #asp.net core identity in mvc #asp.net core mvc login and registration #login and logout in asp.net core

Delete role in asp net core identity framework

#Asp.net core #Asp.net core mvc #Core #Asp.net core tutorials #Asp.net core with entity framework

AllowAnonymous in asp.net core

#Asp.net core #Asp.net core mvc #Core #Asp.net core tutorials #Asp.net core with entity framework