Préface
Masa
Fournit une base de donnéesEntityFramework
Inté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.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
Installation
Swashbuckle.AspNetCore
Pour faciliter le passageSwagger
Pour faire fonctionner le Service
InstallationMicrosoft.EntityFrameworkCore.InMemory
C'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.Tools
C'est pour utiliserCodeFirstCréer une base de donnéesNouvelle classe
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; } }
Nouveau contexte utilisateur
UserDbContext.cs
public class UserDbContext : MasaDbContext { public DbSet<User> User { get; set; } public UserDbContext(MasaDbContextOptions options) : base(options) { } }
UserDbContext
Remplacer 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
AddUserRequest
Comme 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
HostExtensions
Pour 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
,NouveauSwagger
Soutienbuilder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); app.UseSwagger(); app.UseSwaggerUI();
Pas besoin.
Swagger
N'ajoutez pas ,UtiliserSwagger Juste pour tester le Service d'appel ,UtiliserPostman
Ou 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.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(); });
Exécuter le projet par soi - même ,Mise en œuvre
add
Créer un nouvel utilisateur après ,Mise en œuvre ultérieurelist
Obtenir plus d'une donnée utilisateur ,Pour prouverMasaDbContext
Utilisation correcte
Comment utiliser Soft delete
Sélectionner
Assignment.MasaEntityFramework
Et installerMasa.Contrib.Data.Contracts.EF
dotnet add package Masa.Contrib.Data.Contracts.EF --version 0.4.0-rc.4
Modifier 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 pourIsDeleted
Ajout 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 appelezdelete
Méthode supprimer l'utilisateur,Enfin, appelezlist
Mé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
All
La 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
list
Mé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
all
Mé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.InMemory
dotnet add package Masa.Contrib.Data.EntityFrameworkCore.InMemory --version 0.4.0-rc.4
Installez 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
,Nouveaudatabase
Méthodes, Vérifier que la base de données actuelle esttest
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 ""; });
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
UserDbContext
Et ajouterConnectionStringName
Caracté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.cs
builder.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.json
Configuration// "ConnectionStrings": { // "User": "test" // },
Appelez
database
Méthodes, Vérifier que la base de données actuelle esttest2
Méthodes2: RéécritureIConnectionStringProvider
EtIDbConnectionStringProvider
Mise en œuvre et ajout à DIMoyenne
Nouvelle classe
CustomizeConnectionStringProvider
public class CustomizeConnectionStringProvider : IConnectionStringProvider { public Task<string> GetConnectionStringAsync(string name = "DefaultConnection") => Task.FromResult (GetConnectionString(name)); public string GetConnectionString(string name = "DefaultConnection") => "test3"; }
Nouvelle classe
CustomizeDbConnectionStringProvider
public class CustomizeDbConnectionStringProvider : IDbConnectionStringProvider { public List<MasaDbContextConfigurationOptions> DbContextOptionsList { get; } = new() { new MasaDbContextConfigurationOptions("test3") }; }
Modifier
Program.cs
builder.Services.AddSingleton<IConnectionStringProvider,CustomizeConnectionStringProvider>(); builder.Services.AddSingleton<IDbConnectionStringProvider,CustomizeDbConnectionStringProvider>();
Appelez
database
Mé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