当前位置:网站首页>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

边栏推荐
- 如何写出好代码 - 防御式编程
- Exemple Quelle est la relation entre le taux d'échantillonnage, l'échantillon et la durée?
- New words new words new words new words [2]
- Quickly generate IPA package
- [QNX hypervisor 2.2 user manual]6.3.2 configuring VM
- Icml2022 | partial and asymmetric comparative learning of out of distribution detection in long tail recognition
- 深入底层C源码讲透Redis核心设计原理
- [detailed explanation of AUTOSAR 14 startup process]
- 2022年5月腾讯云开发者社区视频月度榜单公布
- 快速生成ipa包
猜你喜欢

2022最新Android面试笔试,一个安卓程序员的面试心得
![2022 latest intermediate and advanced Android interview questions, [principle + practice + Video + source code]](/img/c9/f4ab4578029cf043155a5811a64489.png)
2022 latest intermediate and advanced Android interview questions, [principle + practice + Video + source code]

案例分享|金融业数据运营运维一体化建设

Oracle日期格式转换 to_date,to_char,to_timetamp 相互转换

Case sharing | integrated construction of data operation and maintenance in the financial industry

vs2017 qt的各种坑

@Extension, @spi annotation principle

爬虫01-爬虫基本原理讲解

蚂蚁集团开源可信隐私计算框架「隐语」:开放、通用

Word查找红色文字 Word查找颜色字体 Word查找突出格式文本
随机推荐
怎么自动安装pythn三方库
7-2 keep the linked list in order
Isprs2020/ cloud detection: transferring deep learning models for cloud detection between landsat-8 and proba-v
Personal understanding of convolutional neural network
输油管的布置数学建模matlab,输油管布置的数学模型
SAP 特征 特性 说明
Interprocess communication (IPC): shared memory
Electron installation problems
English sentence pattern reference
Case sharing | integrated construction of data operation and maintenance in the financial industry
紧固件行业供应商绩效考核繁琐?选对工具才能轻松逆袭!
MySQL优化六个点的总结
2022年5月腾讯云开发者社区视频月度榜单公布
Word查找红色文字 Word查找颜色字体 Word查找突出格式文本
2022 Alibaba Android advanced interview questions sharing, 2022 Alibaba hand Taobao Android interview questions
How to choose the most formal and safe external futures platform?
蚂蚁集团开源可信隐私计算框架「隐语」:开放、通用
音视频包的pts,dts,duration的由来.
图扑软件数字孪生智慧风电系统
Lombok @builder annotation
