当前位置:网站首页>5. Data access - entityframework integration
5. Data access - entityframework integration
2022-07-05 18:46:00 【InfoQ】
Preface
MasaEntityFrameworkMasaDbContext 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
AddUserRequestAs 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
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 addedSwaggerSupport
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
SwaggerPostman- 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.MasaEntityFrameworkAnd 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();
});
addlistdeletelistHow to temporarily disable soft deletion 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 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
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.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 addeddatabaseMethod , 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
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 ?
Program.csappsettings.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.jsonTo configure
// "ConnectionStrings": {
// "User": "test"
// },
- call
databaseMethod , Verify whether the current database istest2

IConnectionStringProviderIDbConnectionStringProvider- 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
databaseMethod , Verify whether the current database istest3
summary
MasaDbContextMasaDbContextSource code of this chapter
Open source address

边栏推荐
- buuctf-pwn write-ups (9)
- ROS安装报错 sudo: rosdep:找不到命令
- Rse2020/ cloud detection: accurate cloud detection of high-resolution remote sensing images based on weak supervision and deep learning
- 5. 数据访问 - EntityFramework集成
- Powerful tool for collection processing
- 常见时间复杂度
- 紧固件行业供应商绩效考核繁琐?选对工具才能轻松逆袭!
- Logical words in Articles
- Pytorch yolov5 training custom data
- 企业级数据安全,天翼云是这样理解的
猜你喜欢

Powerful tool for collection processing

怎么自动安装pythn三方库

Summary of six points of MySQL optimization

中文版Postman?功能真心强大!

2022 latest Android interview written examination, an Android programmer's interview experience

小程序 修改样式 ( placeholder、checkbox的样式)

The 10th global Cloud Computing Conference | Huayun data won the "special contribution award for the 10th anniversary of 2013-2022"

使用JMeter录制脚本并调试

LeetCode 6111. 螺旋矩阵 IV

技术分享 | 接口测试价值与体系
随机推荐
2022 latest intermediate and advanced Android interview questions, [principle + practice + Video + source code]
彻底理解为什么网络 I/O 会被阻塞?
sample_ What is the relationship between rate, sample and duration
FCN: Fully Convolutional Networks for Semantic Segmentation
Sibling components carry out value transfer (there is a sequence displayed)
瞅一瞅JUC提供的限流工具Semaphore
ROS installation error sudo: rosdep: command not found
使用文件和目录属性和属性
Introduction to the development function of Hanlin Youshang system of Hansheng Youpin app
vulnhub之darkhole_2
【HCIA-cloud】【1】云计算的定义、什么是云计算、云计算的架构与技术说明、华为云计算产品、华为内存DDR配置工具说明
LeetCode 6109. Number of people who know the secret
EMQX 5.0 正式发布:单集群支持 1 亿 MQTT 连接
线性表——抽象数据类型
SAP 特征 特性 说明
Rse2020/ cloud detection: accurate cloud detection of high-resolution remote sensing images based on weak supervision and deep learning
Reading notes of Clickhouse principle analysis and Application Practice (5)
New words new words new words new words [2]
Problems encountered in the project u-parse component rendering problems
Common time complexity
