Préface
MasaFournit une base de donnéesEntityFrameworkIntégration des données,Et offre des fonctions de filtrage de données et de suppression souple,.Voici comment l'utiliser?
MasaDbContextIntroduction
- Installation.Net 6.0
NouveauASP.NET Core Projet vide
Assignment.MasaEntityFramework,Et installerMasa.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.5Installation
Swashbuckle.AspNetCorePour faciliter le passageSwaggerPour faire fonctionner le Service
InstallationMicrosoft.EntityFrameworkCore.InMemoryC'est pour la commodité, Donc en utilisant la base de données mémoire , Si une autre base de données est nécessaire , Veuillez installer votre propre paquet
InstallationMicrosoft.EntityFrameworkCore.ToolsC'est pour utiliserCodeFirstCréer une base de donnéesNouvelle classe
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; } }Nouveau contexte utilisateur
UserDbContext.cspublic class UserDbContext : MasaDbContext { public DbSet<User> User { get; set; } public UserDbContext(MasaDbContextOptions options) : base(options) { } }UserDbContextRemplacer par héritageMasaDbContext, Et ajouter un constructeur de paramètres ,Le type de paramètre estMasaDbContextOptions
Quand il y a plus d'un projet DbContextHeure, Doit être remplacé par l'héritageMasaDbContext<TDbContext>, Le type de paramètre du constructeur a été changé enMasaDbContext<TDbContext>Nouvelle classe
AddUserRequestComme paramètre pour ajouter un utilisateurpublic class AddUserRequest { public string Name { get; set; } public uint Gender { get; set; } public DateTime BirthDay { get; set; } }Nouvelle classe
HostExtensionsPour migrer la base de données(UtiliserCodeFirst)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); } } }Modifier
Program.cs,NouveauSwaggerSoutienbuilder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); app.UseSwagger(); app.UseSwaggerUI();
Pas besoin.
SwaggerN'ajoutez pas ,UtiliserSwagger Juste pour tester le Service d'appel ,UtiliserPostmanOu autreHttpLes outils aussi.
Modifier
Program.cs,Ajouter un contexte utilisateur(Points saillants)builder.Services.AddMasaDbContext<UserDbContext>(options => { options.Builder = (_, dbContextOptionsBuilder) => dbContextOptionsBuilder.UseInMemoryDatabase("test") });Modifier
Program.cs,Faire en sorte que le projet appuieCodeFirstapp.MigrateDbContext<UserDbContext>((context, services) => { });Pas besoin.CodeFirst, La base de données de génération de code n'est pas prise en charge et ne peut pas être ajoutée
Tests
MasaDbContext,ModifierProgram.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(); });Exécuter le projet par soi - même ,Mise en œuvre
addCréer un nouvel utilisateur après ,Mise en œuvre ultérieurelistObtenir plus d'une donnée utilisateur ,Pour prouverMasaDbContextUtilisation correcte
Comment utiliser Soft delete
Sélectionner
Assignment.MasaEntityFrameworkEt installerMasa.Contrib.Data.Contracts.EFdotnet add package Masa.Contrib.Data.Contracts.EF --version 0.4.0-rc.4Modifier la classe
User,Et réaliserISoftDelete,Modifier le Code comme suit::public class User : ISoftDelete//Points saillants:Au lieu de réaliserISoftDelete { 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; } }Augmentation de la réalisation
ISoftDelete,Et pourIsDeletedAjout d'attributssetSoutien(C'est possible.private set;)Modifier
Program.cs, Et activer le filtrage des donnéesbuilder.Services.AddMasaDbContext<UserDbContext>(options => { options.Builder = (_, dbContextOptionsBuilder) => dbContextOptionsBuilder.UseInMemoryDatabase("test"); options.UseFilter();// Activer le filtrage des données ,Écrivez tout:options.UseFilter(filterOptions => filterOptions.EnableSoftDelete = true); });Tester si la suppression douce a réussi
Modifier
Program.cs, Ajouter une nouvelle méthode de suppressionapp.MapDelete("/delete", (UserDbContext dbContext, int id) => { var user = dbContext.Set<User>().First(u => u.Id == id); dbContext.Set<User>().Remove(user); dbContext.SaveChanges(); });
Enfin,Appelez d'abordadd Méthode après la création de l'utilisateur ,Appelez aprèslist Méthode pour obtenir une liste de tous les utilisateurs , Et retirer l'un ou l'autre idInformation,Puis appelezdeleteMéthode supprimer l'utilisateur,Enfin, appelezlistMéthodes, Voir ce qui a été retiré idExiste - t - il?, Pour vérifier que la suppression douce est valide .
Comment désactiver temporairement le filtrage de suppression souple
La requête par défaut filtre les données dont les étiquettes ont été supprimées sans aucune requête , Mais il y a aussi des scénarios où toutes les données doivent être questionnées , Le filtrage des données est nécessaire IDataFilter
Nouveau
AllLa méthode est utilisée pour interroger toutes les données ( Contient des données marquées comme supprimées )app.MapGet("/all", (UserDbContext dbContext, [FromServices] IDataFilter dataFilter) => { //AdoptionDIObtenirIDataFilter,Et l'appelerDisable La méthode peut être temporairement désactivée ISoftDeleteFiltration conditionnelle using (dataFilter.Disable<ISoftDelete>()) { return dbContext.Set<User>().ToList(); } });Relancer le projet, Répéter l'étape de validation de la suppression souple ,Assurez - vous que
listMéthode impossible d'accéder aux donnéesLa raison pour laquelle l'étape de validation de la suppression souple est répétée est que cet exemple utilise une base de données de mémoire , Après l'arrêt du projet , Toutes les données seront effacées , La ré - exécution vise à s'assurer que les données existent , Uniquement marqué pour la suppression
Mise en œuvre
allMéthodes,Obtenir toutes les données,Voirid Existe - t - il des données utilisateur correspondantes
Obtenir la chaîne de connexion de la base de données à partir du profil
Éléments sélectionnés
Assignment.MasaEntityFramework,Et installerMasa.Contrib.Data.EntityFrameworkCore.InMemorydotnet add package Masa.Contrib.Data.EntityFrameworkCore.InMemory --version 0.4.0-rc.4Installez le paquet de base de données approprié au besoin ,Par exemple::
Masa.Contrib.Data.EntityFrameworkCore.SqlServer(SqlServer)、Masa.Contrib.Data.EntityFrameworkCore.Pomelo.MySql(PomeloFourniMySql)、Masa.Contrib.Data.EntityFrameworkCore.Oracle(Oracle)Attendez.Modifier
Program.cs, Ajuster ajouter un contexte utilisateur configuré pour :builder.Services.AddMasaDbContext<UserDbContext>(options => options.UseInMemoryDatabase().UseFilter());Modifier
appsettings.json, Ajouter une chaîne de connexion à la base de données utilisateur :{ "ConnectionStrings": { "DefaultConnection": "test"// Remplacer par la chaîne de connexion à la base de données spécifiée } }Modifier
Program.cs,NouveaudatabaseMéthodes, Vérifier que la base de données actuelle esttestapp.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 ""; });
Dernière visitehttp://localhost:5002/database, Vérifier que le nom actuel de la base de données correspond au nom modifié de la base de données 
Questions fréquemment posées
- Comment modifier le noeud de configuration pour la lecture par défaut ?
Modifier le contexte de l'utilisateur
UserDbContextEt ajouterConnectionStringNameCaractéristiques:[ConnectionStringName("User")]//Personnaliser le nom du noeud public class UserDbContext : MasaDbContext { public DbSet<User> User { get; set; } public UserDbContext(MasaDbContextOptions options) : base(options) { } }Modifier la configuration
appsettings.json{ "ConnectionStrings": { "User": "test"//Remplacer parUser Le noeud lit la chaîne de connexion à la base de données } }
- En plus d'obtenir à partir du profil , Est - ce que l'obtention de chaînes de connexion de base de données à partir d'autres endroits est également prise en charge ?
Il existe actuellement deux façons de modifier la chaîne de connexion à la base de données .
Méthodes1: ModifierProgram.cs,Et supprimerappsettings.json Configuration de la chaîne de connexion à la base de données
Modifier
Program.csbuilder.Services.Configure<MasaDbConnectionOptions>(option => { option.ConnectionStrings = new ConnectionStrings(new List<KeyValuePair<string, string>>() { new("User", "test2")// Où la clé est le nom du noeud ,AvecConnectionStringNameCaractéristiqueNameLes valeurs sont cohérentes,Si non spécifiéConnectionStringName,Ça devrait êtreDefaultConnection, La valeur est la chaîne de connexion à la base de données }); });Modifier
appsettings.jsonConfiguration// "ConnectionStrings": { // "User": "test" // },Appelez
databaseMéthodes, Vérifier que la base de données actuelle esttest2

Méthodes2: RéécritureIConnectionStringProviderEtIDbConnectionStringProvider Mise en œuvre et ajout à DIMoyenne
Nouvelle classe
CustomizeConnectionStringProviderpublic class CustomizeConnectionStringProvider : IConnectionStringProvider { public Task<string> GetConnectionStringAsync(string name = "DefaultConnection") => Task.FromResult (GetConnectionString(name)); public string GetConnectionString(string name = "DefaultConnection") => "test3"; }Nouvelle classe
CustomizeDbConnectionStringProviderpublic class CustomizeDbConnectionStringProvider : IDbConnectionStringProvider { public List<MasaDbContextConfigurationOptions> DbContextOptionsList { get; } = new() { new MasaDbContextConfigurationOptions("test3") }; }Modifier
Program.csbuilder.Services.AddSingleton<IConnectionStringProvider,CustomizeConnectionStringProvider>(); builder.Services.AddSingleton<IDbConnectionStringProvider,CustomizeDbConnectionStringProvider>();Appelez
databaseMéthodes, Vérifier que la base de données actuelle esttest3
Résumé
Cet article explique principalementMasaDbContext Utilisation de base et suppression douce 、 Comment utiliser le filtrage des données , Dans le prochain article, nous vous expliquerons MasaDbContext Comment réaliser la suppression douce 、 Données filtrées , Et comment cet article fait référence à l'utilisation d'une base de données sans spécifier une chaîne de liens de base de données
Source de ce chapitre
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
Si vous nous faites MASA Framework Intéressé par,Qu'il s'agisse d'une contribution de code、Utiliser、Tip Issue,Bienvenue à nous contacter





![19.[STM32]HC_ SR04 ultrasonic ranging_ Timer mode (OLED display)](/img/fe/8f59db28823290da8e9280df06673d.jpg)



