当前位置:网站首页>5. Data access - entityframework integration
5. Data access - entityframework integration
2022-07-05 18:46:00 【InfoQ】
Preface
Masa
EntityFramework
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.Tools
dotnet 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.5
> install `Swashbuckle.AspNetCore` For the convenience of passing `Swagger` To operate the service
> install `Microsoft.EntityFrameworkCore.InMemory` It's for convenience , So use an in memory database , If you need to use other databases , Please install the corresponding package by yourself
> install `Microsoft.EntityFrameworkCore.Tools` To use CodeFirst Create database
- The new class
User
public 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.cs
public class UserDbContext : MasaDbContext
{
public DbSet<User> User { get; set; }
public UserDbContext(MasaDbContextOptions options) : base(options)
{
}
}
> `UserDbContext` Instead of inheritance `MasaDbContext`, And add a parameter constructor , Parameter type is `MasaDbContextOptions`
> When there are multiple DbContext when , It needs to be inherited `MasaDbContext<TDbContext>`, The constructor parameter type is changed to `MasaDbContext<TDbContext>`
- The new class
AddUserRequest
As a parameter for adding users
public class AddUserRequest
{
public string Name { get; set; }
public uint Gender { get; set; }
public DateTime BirthDay { get; set; }
}
- The new class
HostExtensions
For 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 addedSwagger
Support
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
Swagger
Postman
- 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 CodeFirst
app.MigrateDbContext<UserDbContext>((context, services) =>
{
});
> Unwanted CodeFirst, Code generation is not supported, and the database cannot be added
- test
MasaDbContext
, modifyProgram.cs
app.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 `add` Then create a new user , After performing `list` Get more than one user data , Then prove `MasaDbContext` Correct use
How to use soft delete
- Choose
Assignment.MasaEntityFramework
And installMasa.Contrib.Data.Contracts.EF
dotnet add package Masa.Contrib.Data.Contracts.EF --version 0.4.0-rc.4
- Modify 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 for `IsDeleted` Attribute addition set Support ( It can be private set;)
- modify
Program.cs
, And enable data filtering
builder.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 method
app.MapDelete("/delete", (UserDbContext dbContext, int id) =>
{
var user = dbContext.Set<User>().First(u => u.Id == id);
dbContext.Set<User>().Remove(user);
dbContext.SaveChanges();
});
add
list
delete
list
How to temporarily disable soft deletion filtering
IDataFilter
- newly added
All
Method 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
list
Method cannot access data
- The 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
all
Method , 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.InMemory
dotnet add package Masa.Contrib.Data.EntityFrameworkCore.InMemory --version 0.4.0-rc.4
> Install 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 addeddatabase
Method , Verify that the current database istest
app.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 "";
});
http://localhost:5002/database
common problem
- How to change the default read configuration node ?
- Modify user context
UserDbContext
And increaseConnectionStringName
characteristic :
[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 ?
Program.cs
appsettings.json
- modify
Program.cs
builder.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.json
To configure
// "ConnectionStrings": {
// "User": "test"
// },
- call
database
Method , Verify whether the current database istest2
IConnectionStringProvider
IDbConnectionStringProvider
- The new class
CustomizeConnectionStringProvider
public class CustomizeConnectionStringProvider : IConnectionStringProvider
{
public Task<string> GetConnectionStringAsync(string name = "DefaultConnection") => Task.FromResult (GetConnectionString(name));
public string GetConnectionString(string name = "DefaultConnection") => "test3";
}
- The new class
CustomizeDbConnectionStringProvider
public class CustomizeDbConnectionStringProvider : IDbConnectionStringProvider
{
public List<MasaDbContextConfigurationOptions> DbContextOptionsList { get; } = new()
{
new MasaDbContextConfigurationOptions("test3")
};
}
- modify
Program.cs
builder.Services.AddSingleton<IConnectionStringProvider,CustomizeConnectionStringProvider>();
builder.Services.AddSingleton<IDbConnectionStringProvider,CustomizeDbConnectionStringProvider>();
- call
database
Method , Verify whether the current database istest3
summary
MasaDbContext
MasaDbContext
Source code of this chapter
Open source address
边栏推荐
猜你喜欢
LeetCode 6109. 知道秘密的人数
websocket 工具的使用
小程序 修改样式 ( placeholder、checkbox的样式)
MYSQL中 find_in_set() 函数用法详解
vulnhub之darkhole_2
视频自监督学习综述
2022 Alibaba Android advanced interview questions sharing, 2022 Alibaba hand Taobao Android interview questions
A2L file parsing based on CAN bus (3)
Thoroughly understand why network i/o is blocked?
彻底理解为什么网络 I/O 会被阻塞?
随机推荐
2022最新Android面试笔试,一个安卓程序员的面试心得
中文版Postman?功能真心强大!
ConvMAE(2022-05)
Memory leak of viewpager + recyclerview
Various pits of vs2017 QT
RedHat7.4配置yum软件仓库(RHEL7.4)
Is it safe for golden sun to open an account? Can I open an account free of 5 in case?
Idea configuring NPM startup
深入底层C源码讲透Redis核心设计原理
Find in MySQL_ in_ Detailed explanation of set() function usage
vs2017 qt的各种坑
Rse2020/ cloud detection: accurate cloud detection of high-resolution remote sensing images based on weak supervision and deep learning
How to automatically install pythn third-party libraries
Is it safe for Apple mobile phone to speculate in stocks? Is it a fraud to get new debts?
Isprs2020/ cloud detection: transferring deep learning models for cloud detection between landsat-8 and proba-v
Interprocess communication (IPC): shared memory
LeetCode 6111. 螺旋矩阵 IV
【HCIA-cloud】【1】云计算的定义、什么是云计算、云计算的架构与技术说明、华为云计算产品、华为内存DDR配置工具说明
输油管的布置数学建模matlab,输油管布置的数学模型
Powerful tool for collection processing