当前位置:网站首页>5. Data access - entityframework integration
5. Data access - entityframework integration
2022-07-07 05:33:00 【MASA team】
Preface
Masa Provides the basis for EntityFramework Data integration for , It also provides the functions of data filtering and soft deletion , Now we will introduce how to use it ?
MasaDbContext introduction
- install .Net 6.0
newly build ASP.NET Core Empty item
Assignment.MasaEntityFramework, And installMasa.Contrib.Data.EntityFrameworkCore、Swashbuckle.AspNetCore、Microsoft.EntityFrameworkCore.InMemory、Microsoft.EntityFrameworkCore.Toolsdotnet add package Masa.Contrib.Data.EntityFrameworkCore --version 0.4.0-rc.4 dotnet add package Swashbuckle.AspNetCore --version 6.2.3 dotnet add package Microsoft.EntityFrameworkCore.InMemory --version 6.0.5 dotnet add package Microsoft.EntityFrameworkCore.Tools --version 6.0.5install
Swashbuckle.AspNetCoreFor the convenience of passingSwaggerTo operate the service
installMicrosoft.EntityFrameworkCore.InMemoryIt's for convenience , So use an in memory database , If you need to use other databases , Please install the corresponding package by yourself
installMicrosoft.EntityFrameworkCore.ToolsTo use CodeFirst Create databaseThe new class
Userpublic class User { public int Id { get; set; } public string Name { get; set; } public uint Gender { get; set; } public DateTime BirthDay { get; set; } public DateTime CreationTime { get; set; } public User() { this.CreationTime = DateTime.Now; } }New user context
UserDbContext.cspublic class UserDbContext : MasaDbContext { public DbSet<User> User { get; set; } public UserDbContext(MasaDbContextOptions options) : base(options) { } }UserDbContextInstead of inheritanceMasaDbContext, And add a parameter constructor , Parameter type isMasaDbContextOptions
When there are multiple DbContext when , It needs to be inheritedMasaDbContext<TDbContext>, The constructor parameter type is changed toMasaDbContext<TDbContext>The new class
AddUserRequestAs a parameter for adding userspublic class AddUserRequest { public string Name { get; set; } public uint Gender { get; set; } public DateTime BirthDay { get; set; } }The new class
HostExtensionsFor migrating databases ( Use CodeFirst)public static class HostExtensions { public static void MigrateDbContext<TContext>( this IHost host, Action<TContext, IServiceProvider> seeder) where TContext : DbContext { using (var scope = host.Services.CreateScope()) { var services = scope.ServiceProvider; var context = services.GetRequiredService<TContext>(); context.Database.EnsureCreated(); seeder(context, services); } } }modify
Program.cs, newly addedSwaggerSupportbuilder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); app.UseSwagger(); app.UseSwaggerUI();
Unwanted
SwaggerDon't add , Use Swagger Just to test and invoke the service , UsePostmanOr something else Http Tools can also
modify
Program.cs, Add user context ( a key )builder.Services.AddMasaDbContext<UserDbContext>(options => { options.Builder = (_, dbContextOptionsBuilder) => dbContextOptionsBuilder.UseInMemoryDatabase("test") });modify
Program.cs, Make the project support CodeFirstapp.MigrateDbContext<UserDbContext>((context, services) => { });Unwanted CodeFirst, Code generation is not supported, and the database cannot be added
test
MasaDbContext, modifyProgram.csapp.MapPost("/add", (UserDbContext dbContext, [FromBody] AddUserRequest request) => { dbContext.Set<User>().Add(new User() { Name = request.Name, Gender = request.Gender, BirthDay = request.BirthDay }); dbContext.SaveChanges(); }); app.MapGet("/list", (UserDbContext dbContext) => { return dbContext.Set<User>().ToList(); });Run the project by yourself , perform
addThen create a new user , After performinglistGet more than one user data , Then proveMasaDbContextCorrect use
How to use soft delete
Choose
Assignment.MasaEntityFrameworkAnd installMasa.Contrib.Data.Contracts.EFdotnet add package Masa.Contrib.Data.Contracts.EF --version 0.4.0-rc.4Modify the class
User, And implementISoftDelete, Change the code to :public class User : ISoftDelete// a key : Change to implementation ISoftDelete { public int Id { get; set; } public string Name { get; set; } public uint Gender { get; set; } public DateTime BirthDay { get; set; } public DateTime CreationTime { get; set; } public bool IsDeleted { get; private set; } public User() { this.CreationTime = DateTime.Now; } }Increase implementation
ISoftDelete, And forIsDeletedAttribute addition set Support ( It can be private set;)modify
Program.cs, And enable data filteringbuilder.Services.AddMasaDbContext<UserDbContext>(options => { options.Builder = (_, dbContextOptionsBuilder) => dbContextOptionsBuilder.UseInMemoryDatabase("test"); options.UseFilter();// Enable data filtering , Complete writing :options.UseFilter(filterOptions => filterOptions.EnableSoftDelete = true); });Test whether the soft deletion is successful
modify
Program.cs, Add delete methodapp.MapDelete("/delete", (UserDbContext dbContext, int id) => { var user = dbContext.Set<User>().First(u => u.Id == id); dbContext.Set<User>().Remove(user); dbContext.SaveChanges(); });
Last , First call add Method after creating the user , Call later list Method to get the list of all users , And take out any one id Information , Then call delete Method to delete the user , Last call list Method , View removed id Whether there is , To verify whether the soft deletion is effective .
How to temporarily disable soft deletion filtering
In the default query, the data marked with deleted tags will be filtered and no longer be queried , But there are also some scenarios that need to query all the data , At this point, you need to use data filtering IDataFilter
newly added
AllMethod is used to query all data ( Contains data marked as deleted )app.MapGet("/all", (UserDbContext dbContext, [FromServices] IDataFilter dataFilter) => { // adopt DI Get IDataFilter, And call it Disable Method can be temporarily disabled ISoftDelete filter using (dataFilter.Disable<ISoftDelete>()) { return dbContext.Set<User>().ToList(); } });Rerun the project , Repeat the steps of verifying soft deletion , Make sure to pass
listMethod cannot access dataThe reason for repeating the verify soft delete step is that this example uses an in memory database , After the project stops , All data will be cleared , Re execution is to ensure that the data exists , Only marked for deletion
perform
allMethod , Get all the data , see id Whether the corresponding user data exists
Get the database connection string from the configuration file
Selected items
Assignment.MasaEntityFramework, And installMasa.Contrib.Data.EntityFrameworkCore.InMemorydotnet add package Masa.Contrib.Data.EntityFrameworkCore.InMemory --version 0.4.0-rc.4Install the corresponding database package as needed , Such as :
Masa.Contrib.Data.EntityFrameworkCore.SqlServer(SqlServer)、Masa.Contrib.Data.EntityFrameworkCore.Pomelo.MySql(Pomelo Provided MySql)、Masa.Contrib.Data.EntityFrameworkCore.Oracle(Oracle) etc.modify
Program.cs, Adjust the configuration of adding user context to :builder.Services.AddMasaDbContext<UserDbContext>(options => options.UseInMemoryDatabase().UseFilter());modify
appsettings.json, Add user database connection string :{ "ConnectionStrings": { "DefaultConnection": "test"// Replace with the specified database connection string } }modify
Program.cs, newly addeddatabaseMethod , Verify that the current database istestapp.MapGet("/database", (UserDbContext dbContext) => { var field = typeof(MasaDbContext).GetField("Options", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic)!; var masaDbContextOptions = field.GetValue(dbContext) as MasaDbContextOptions; foreach (var dbContextOptionsExtension in masaDbContextOptions!.Extensions) { if (dbContextOptionsExtension is InMemoryOptionsExtension memoryOptionsExtension) { return memoryOptionsExtension.StoreName; } } return ""; });
Last visit http://localhost:5002/database, Verify whether the current database name is consistent with the modified database name 
common problem
- How to change the default read configuration node ?
Modify user context
UserDbContextAnd increaseConnectionStringNamecharacteristic :[ConnectionStringName("User")]// Custom node name public class UserDbContext : MasaDbContext { public DbSet<User> User { get; set; } public UserDbContext(MasaDbContextOptions options) : base(options) { } }Modify the configuration
appsettings.json{ "ConnectionStrings": { "User": "test"// Instead of from User The node reads the database connection string } }
- In addition to getting from the configuration file , Does it also support getting database connection strings from other places ?
There are currently two ways to change the database connection string .
Method 1: modify Program.cs, And delete appsettings.json Configuration of database connection string
modify
Program.csbuilder.Services.Configure<MasaDbConnectionOptions>(option => { option.ConnectionStrings = new ConnectionStrings(new List<KeyValuePair<string, string>>() { new("User", "test2")// Where the key is the node name , And ConnectionStringName Characteristic Name Keep the values consistent , If not specified ConnectionStringName, It should be DefaultConnection, The value is the database connection string }); });modify
appsettings.jsonTo configure// "ConnectionStrings": { // "User": "test" // },call
databaseMethod , Verify whether the current database istest2

Method 2: rewrite IConnectionStringProvider and IDbConnectionStringProvider And add to DI in
The new class
CustomizeConnectionStringProviderpublic class CustomizeConnectionStringProvider : IConnectionStringProvider { public Task<string> GetConnectionStringAsync(string name = "DefaultConnection") => Task.FromResult (GetConnectionString(name)); public string GetConnectionString(string name = "DefaultConnection") => "test3"; }The new class
CustomizeDbConnectionStringProviderpublic class CustomizeDbConnectionStringProvider : IDbConnectionStringProvider { public List<MasaDbContextConfigurationOptions> DbContextOptionsList { get; } = new() { new MasaDbContextConfigurationOptions("test3") }; }modify
Program.csbuilder.Services.AddSingleton<IConnectionStringProvider,CustomizeConnectionStringProvider>(); builder.Services.AddSingleton<IDbConnectionStringProvider,CustomizeDbConnectionStringProvider>();call
databaseMethod , Verify whether the current database istest3
summary
This article mainly explains MasaDbContext Basic usage and soft deletion 、 How to use data filtering , In the next article, we will explain MasaDbContext How to realize soft deletion 、 Data filtered , And how to realize it when using the database without specifying the database link string mentioned in this article
Source code of this chapter
Assignment05
https://github.com/zhenlei520/MasaFramework.Practice
Open source address
MASA.BuildingBlocks:https://github.com/masastack/MASA.BuildingBlocks
MASA.Contrib:https://github.com/masastack/MASA.Contrib
MASA.Utils:https://github.com/masastack/MASA.Utils
MASA.EShop:https://github.com/masalabs/MASA.EShop
MASA.Blazor:https://github.com/BlazorComponent/MASA.Blazor
If you treat our MASA Framework Interested in , Whether it's code contribution 、 Use 、 carry Issue, Welcome to contact us

边栏推荐
- Creation and use of thread pool
- 拼多多商品详情接口、拼多多商品基本信息、拼多多商品属性接口
- Design, configuration and points for attention of network specified source multicast (SSM) simulation using OPNET
- MySQL数据库学习(8) -- mysql 内容补充
- Leetcode (46) - Full Permutation
- Flink SQL 实现读写redis,并动态生成Hset key
- 导航栏根据路由变换颜色
- 论文阅读【Sensor-Augmented Egocentric-Video Captioning with Dynamic Modal Attention】
- 基于 hugging face 预训练模型的实体识别智能标注方案:生成doccano要求json格式
- 【js组件】date日期显示。
猜你喜欢

在米家、欧瑞博、苹果HomeKit趋势下,智汀如何从中脱颖而出?

一条 update 语句的生命经历

LabVIEW is opening a new reference, indicating that the memory is full

Intelligent annotation scheme of entity recognition based on hugging Face Pre training model: generate doccano request JSON format

10 distributed databases that take you to the galaxy

Senior programmers must know and master. This article explains in detail the principle of MySQL master-slave synchronization, and recommends collecting

1.AVL树:左右旋-bite

4. 对象映射 - Mapping.Mapster

Initial experience of annotation

Mysql database learning (8) -- MySQL content supplement
随机推荐
Lombok插件
Summary of the mean value theorem of higher numbers
[opencv] image morphological operation opencv marks the positions of different connected domains
DFS, BFS and traversal search of Graphs
np. random. Shuffle and np Use swapaxis or transfer with caution
Knapsack problem (01 knapsack, complete knapsack, dynamic programming)
Safe landing practice of software supply chain under salesforce containerized ISV scenario
QSlider of QT control style series (I)
Aidl and service
导航栏根据路由变换颜色
Phenomenon analysis when Autowired annotation is used for list
AIDL 与Service
JSP setting header information export to excel
Complete code of C language neural network and its meaning
How can project managers counter attack with NPDP certificates? Look here
论文阅读【Semantic Tag Augmented XlanV Model for Video Captioning】
说一说MVCC多版本并发控制器?
Design, configuration and points for attention of network specified source multicast (SSM) simulation using OPNET
Leakage relay llj-100fs
K6el-100 leakage relay