prefacio
Masa
Proporciona EntityFramework
integración de datos basada en datos y proporciona funciones de filtrado de datos y eliminación suave. A continuación, presentaremos cómo usarlo.
Primeros pasos con MasaDbContext
- Instalar .Net 6.0
-
Cree un nuevo proyecto vacío de ASP.NET Core
Assignment.MasaEntityFramework
e instaleMasa.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
La instalación
Swashbuckle.AspNetCore
es para la convenienciaSwagger
de operar el servicio. La instalaciónMicrosoft.EntityFrameworkCore.InMemory
es para la conveniencia, así que use la base de datos en memoria. Si necesita usar otras bases de datos, instale el paquete correspondiente usted mismo. La instalaciónMicrosoft.EntityFrameworkCore.Tools
es para usar CodeFirst para crear una base de datos. -
Nueva clase
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; } }
-
Nuevo contexto de usuario
UserDbContext.cs
public class UserDbContext : MasaDbContext { public DbSet<User> User { get; set; } public UserDbContext(MasaDbContextOptions options) : base(options) { } }
UserDbContext
Cambie a heritageMasaDbContext
y agregue un constructor con un parámetro, el tipo de parámetro esMasaDbContextOptions
Cuando hay varios DbContexts en el proyecto, debe cambiarse a heritageMasaDbContext<TDbContext>
y el tipo de parámetro del constructor se cambia aMasaDbContext<TDbContext>
-
Crear una nueva clase
AddUserRequest
como parámetro para agregar un usuariopublic class AddUserRequest { public string Name { get; set; } public uint Gender { get; set; } public DateTime BirthDay { get; set; } }
-
Nueva clase
HostExtensions
para migrar base de datos (usando 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); } } }
-
Modificar
Program.cs
, agregarSwagger
soportebuilder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); app.UseSwagger(); app.UseSwaggerUI();
No es necesario
Swagger
agregar, use Swagger solo para probar el servicio de llamadas,Postman
o también se pueden usar otras herramientas Http
-
Modificar
Program.cs
, agregar contexto de usuario (énfasis)builder.Services.AddMasaDbContext<UserDbContext>(options => { options.Builder = (_, dbContextOptionsBuilder) => dbContextOptionsBuilder.UseInMemoryDatabase("test") });
-
Modificado
Program.cs
para que el proyecto sea compatible con CodeFirst.app.MigrateDbContext<UserDbContext>((context, services) => { });
No se requiere CodeFirst y no es necesario agregar una base de datos que no admita la generación de código.
-
probar
MasaDbContext
, modificarProgram.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(); });
Ejecute el proyecto usted mismo
add
, cree un nuevo usuario después de la ejecución y luego ejecútelolist
para obtener más de un dato de usuario, lo que prueba que elMasaDbContext
uso es correcto
Cómo usar la eliminación suave
-
seleccionar
Assignment.MasaEntityFramework
e instalarMasa.Contrib.Data.Contracts.EF
dotnet add package Masa.Contrib.Data.Contracts.EF --version 0.4.0-rc.4
-
Modifique la clase
User
e implementeISoftDelete
, el código se cambia a:public class User : ISoftDelete//重点:改为实现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; } }
Agregue implementación
ISoftDelete
yIsDeleted
agregue soporte de conjunto para propiedades (puede ser un conjunto privado;) -
Modificar
Program.cs
y habilitar el filtrado de datosbuilder.Services.AddMasaDbContext<UserDbContext>(options => { options.Builder = (_, dbContextOptionsBuilder) => dbContextOptionsBuilder.UseInMemoryDatabase("test"); options.UseFilter();//启用数据过滤,完整写法:options.UseFilter(filterOptions => filterOptions.EnableSoftDelete = true); });
-
Probar si la eliminación temporal fue exitosa
-
Modificar
Program.cs
, agregar método de eliminaciónapp.MapDelete("/delete", (UserDbContext dbContext, int id) => { var user = dbContext.Set<User>().First(u => u.Id == id); dbContext.Set<User>().Remove(user); dbContext.SaveChanges(); });
Finalmente, primero llame al add
método para crear un usuario, luego llame list
al método para obtener una lista de todos los usuarios y recupere cualquier información de identificación, luego llame al delete
método para eliminar al usuario y finalmente llame list
al método para verificar si la identificación recuperada existe . , para verificar el software Si la eliminación es válida.
Cómo deshabilitar temporalmente el filtrado de eliminación temporal
En la consulta predeterminada, los datos que se marcaron como eliminados se filtrarán y ya no se consultarán, pero también hay algunos escenarios en los que es necesario consultar todos los datos, en cuyo caso se requiere el filtrado de datos.IDataFilter
-
Método agregado
All
para consultar todos los datos (incluidos los datos marcados para su eliminación)app.MapGet("/all", (UserDbContext dbContext, [FromServices] IDataFilter dataFilter) => { //通过DI获取到IDataFilter,并调用其Disable方法可临时禁用ISoftDelete条件过滤 using (dataFilter.Disable<ISoftDelete>()) { return dbContext.Set<User>().ToList(); } });
-
Vuelva a ejecutar el proyecto y repita los pasos de verificación de eliminación temporal para asegurarse de que
list
no se pueda acceder a los datos a través del métodoEl motivo para ejecutar repetidamente el paso de eliminación temporal de verificación es que este ejemplo usa una base de datos en memoria. Después de detener el proyecto, se vaciarán todos los datos. La nueva ejecución es para asegurarse de que los datos existen y solo se marcan para su eliminación. .
-
Ejecute el
all
método, obtenga todos los datos y verifique si existen los datos de usuario correspondientes a la identificación.
Obtenga la cadena de conexión de la base de datos del archivo de configuración
-
Seleccione el proyecto
Assignment.MasaEntityFramework
e instaleMasa.Contrib.Data.EntityFrameworkCore.InMemory
dotnet add package Masa.Contrib.Data.EntityFrameworkCore.InMemory --version 0.4.0-rc.4
Instale el paquete de base de datos correspondiente según sea necesario, como:
Masa.Contrib.Data.EntityFrameworkCore.SqlServer
(SqlServer),Masa.Contrib.Data.EntityFrameworkCore.Pomelo.MySql
(MySql proporcionado por Pomelo),Masa.Contrib.Data.EntityFrameworkCore.Oracle
(Oracle), etc. -
Modifique
Program.cs
, ajuste la configuración de contexto de agregar usuario a:builder.Services.AddMasaDbContext<UserDbContext>(options => options.UseInMemoryDatabase().UseFilter());
-
Modifique
appsettings.json
, aumente la cadena de conexión de la base de datos del usuario:{ "ConnectionStrings": { "DefaultConnection": "test"//更换为指定的数据库连接字符串 } }
-
Modifique
Program.cs
, agreguedatabase
un método, verifique que la base de datos actual seatest
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 ""; });
Última visita http://localhost:5002/database
para verificar si el nombre de la base de datos actual es el mismo que el nombre de la base de datos modificada
problema comun
- ¿Cómo cambiar el nodo de configuración de lectura predeterminado?
-
Modifique el contexto del usuario
UserDbContext
y agregueConnectionStringName
características:[ConnectionStringName("User")]//自定义节点名 public class UserDbContext : MasaDbContext { public DbSet<User> User { get; set; } public UserDbContext(MasaDbContextOptions options) : base(options) { } }
-
Cambio de configuracion
appsettings.json
{ "ConnectionStrings": { "User": "test"//改为从User节点读取数据库连接字符串 } }
- ¿Se admite obtener la cadena de conexión de la base de datos desde otro lugar que no sea el archivo de configuración?
Actualmente hay dos formas de cambiar la cadena de conexión de la base de datos.
Método 1: modificar Program.cs
y eliminar appsettings.json
la configuración de la cadena de conexión de la base de datos
-
Revisar
Program.cs
builder.Services.Configure<MasaDbConnectionOptions>(option => { option.ConnectionStrings = new ConnectionStrings(new List<KeyValuePair<string, string>>() { new("User", "test2")//其中键为节点名,与ConnectionStringName特性的Name值保持一致即可,如果未指定ConnectionStringName,则应该为DefaultConnection,值为数据库连接字符串 }); });
-
Modificar
appsettings.json
configuración// "ConnectionStrings": { // "User": "test" // },
-
Llame
database
al método para verificar si la base de datos actual estest2
Método 2: anular la implementación de IConnectionStringProvider
sum IDbConnectionStringProvider
y agregar a DI
-
Nueva clase
CustomizeConnectionStringProvider
public class CustomizeConnectionStringProvider : IConnectionStringProvider { public Task<string> GetConnectionStringAsync(string name = "DefaultConnection") => Task.FromResult (GetConnectionString(name)); public string GetConnectionString(string name = "DefaultConnection") => "test3"; }
-
Nueva clase
CustomizeDbConnectionStringProvider
public class CustomizeDbConnectionStringProvider : IDbConnectionStringProvider { public List<MasaDbContextConfigurationOptions> DbContextOptionsList { get; } = new() { new MasaDbContextConfigurationOptions("test3") }; }
-
Revisar
Program.cs
builder.Services.AddSingleton<IConnectionStringProvider,CustomizeConnectionStringProvider>(); builder.Services.AddSingleton<IDbConnectionStringProvider,CustomizeDbConnectionStringProvider>();
-
Llame
database
al método para verificar si la base de datos actual estest3
Resumir
Este artículo explica principalmente el MasaDbContext
uso básico y cómo usar la eliminación temporal y el filtrado de datos. En el siguiente artículo, explicaremos MasaDbContext
cómo implementar la eliminación temporal y el filtrado de datos, y cómo usar la base de datos sin especificar el carácter de enlace de la base de datos mencionado en este artículo. ¿Cómo se implementa el tiempo de cadena?
Código fuente de este capítulo
Tarea05
https://github.com/zhenlei520/MasaFramework.Practice
dirección de fuente abierta
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
Si está interesado en nuestro Marco MASA, ya sea contribución de código, uso o emisión, contáctenos