avant-propos
Masa
Fournit EntityFramework
une intégration de données basée sur les données et fournit des fonctions de filtrage de données et de suppression logicielle. Ci-dessous, nous présenterons comment l'utiliser ?
Premiers pas avec MasaDbContext
- Installer .Net 6.0
-
Créez un nouveau projet vide ASP.NET Core
Assignment.MasaEntityFramework
et installezMasa.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
L' installation
Swashbuckle.AspNetCore
est pour la commoditéSwagger
de l'utilisation de l'installation du serviceMicrosoft.EntityFrameworkCore.InMemory
est pour la commodité, utilisez donc la base de données en mémoire, si vous avez besoin d'utiliser d'autres bases de données, veuillez installer vous-même le package correspondant L'installationMicrosoft.EntityFrameworkCore.Tools
consiste à utiliser CodeFirst pour créer une base de données -
nouvelle 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
Passez à heritageMasaDbContext
et ajoutez un constructeur avec un paramètre, le type de paramètre estMasaDbContextOptions
Lorsqu'il y a plusieurs DbContexts dans le projet, il doit être changé en heritageMasaDbContext<TDbContext>
et le type de paramètre du constructeur est changé enMasaDbContext<TDbContext>
-
Créer une nouvelle classe
AddUserRequest
en tant que 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 la migration de la base de données (à l'aide de 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); } } }
-
Modifier
Program.cs
, ajouterSwagger
un supportbuilder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); app.UseSwagger(); app.UseSwaggerUI();
Pas besoin
Swagger
d'ajouter, utilisez Swagger juste pour tester le service d'appel,Postman
ou d'autres outils Http peuvent également être utilisés
-
Modifier
Program.cs
, ajouter un contexte utilisateur (emphase)builder.Services.AddMasaDbContext<UserDbContext>(options => { options.Builder = (_, dbContextOptionsBuilder) => dbContextOptionsBuilder.UseInMemoryDatabase("test") });
-
Modifié
Program.cs
pour que le projet prenne en charge CodeFirstapp.MigrateDbContext<UserDbContext>((context, services) => { });
CodeFirst n'est pas requis et il n'est pas nécessaire d'ajouter une base de données qui ne prend pas en charge la génération de code
-
tester
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écutez le projet par vous -même
add
, créez un nouvel utilisateur après l'exécution, puis exécutezlist
pour obtenir plusieurs données utilisateur, ce qui prouve que l'MasaDbContext
utilisation est correcte
Comment utiliser la suppression réversible
-
sélectionner
Assignment.MasaEntityFramework
et installerMasa.Contrib.Data.Contracts.EF
dotnet add package Masa.Contrib.Data.Contracts.EF --version 0.4.0-rc.4
-
Modifiez la classe
User
et implémentezISoftDelete
, le code est remplacé par :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; } }
Ajoutez la mise
ISoftDelete
en œuvre etIsDeleted
ajoutez la prise en charge des ensembles pour les propriétés (peut être un ensemble privé ;) -
Modifier
Program.cs
et activer le filtrage des donnéesbuilder.Services.AddMasaDbContext<UserDbContext>(options => { options.Builder = (_, dbContextOptionsBuilder) => dbContextOptionsBuilder.UseInMemoryDatabase("test"); options.UseFilter();//启用数据过滤,完整写法:options.UseFilter(filterOptions => filterOptions.EnableSoftDelete = true); });
-
Tester si la suppression réversible a réussi
-
Modifier
Program.cs
, ajouter une 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'abord la add
méthode pour créer un utilisateur, puis appelez list
la méthode pour obtenir une liste de tous les utilisateurs et récupérez toutes les informations d'identification, puis appelez la delete
méthode pour supprimer l'utilisateur, et enfin appelez list
la méthode pour vérifier si l'identifiant récupéré existe , afin de vérifier le logiciel Si la suppression est valide.
Comment désactiver temporairement le filtrage de suppression réversible
Dans la requête par défaut, les données qui ont été marquées comme supprimées seront filtrées et ne seront plus interrogées, mais il existe également des scénarios où toutes les données doivent être interrogées, auquel cas le filtrage des données est requisIDataFilter
-
Ajout
All
d'une méthode pour interroger toutes les données (y compris les données marquées pour suppression)app.MapGet("/all", (UserDbContext dbContext, [FromServices] IDataFilter dataFilter) => { //通过DI获取到IDataFilter,并调用其Disable方法可临时禁用ISoftDelete条件过滤 using (dataFilter.Disable<ISoftDelete>()) { return dbContext.Set<User>().ToList(); } });
-
Réexécutez le projet et répétez les étapes de vérification de la suppression réversible pour vous assurer que les
list
données ne sont pas accessibles via la méthodeLa raison de l'exécution répétée de l'étape de suppression réversible de vérification est que cet exemple utilise une base de données en mémoire. Après l'arrêt du projet, toutes les données seront vidées. La réexécution permet de s'assurer que les données existent et qu'elles sont uniquement marquées pour suppression .
-
Exécutez la
all
méthode, récupérez toutes les données et vérifiez si les données utilisateur correspondant à l'identifiant existent
Obtenir la chaîne de connexion à la base de données à partir du fichier de configuration
-
Sélectionnez le projet
Assignment.MasaEntityFramework
et installezMasa.Contrib.Data.EntityFrameworkCore.InMemory
dotnet add package Masa.Contrib.Data.EntityFrameworkCore.InMemory --version 0.4.0-rc.4
Installez le package de base de données correspondant selon vos besoins, tel que :
Masa.Contrib.Data.EntityFrameworkCore.SqlServer
(SqlServer),Masa.Contrib.Data.EntityFrameworkCore.Pomelo.MySql
(MySql fourni par Pomelo),Masa.Contrib.Data.EntityFrameworkCore.Oracle
(Oracle), etc. -
Modifier
Program.cs
, ajustez la configuration du contexte d'ajout d'utilisateur à :builder.Services.AddMasaDbContext<UserDbContext>(options => options.UseInMemoryDatabase().UseFilter());
-
Modifiez
appsettings.json
, augmentez la chaîne de connexion à la base de données utilisateur :{ "ConnectionStrings": { "DefaultConnection": "test"//更换为指定的数据库连接字符串 } }
-
Modifier
Program.cs
, ajouterdatabase
une méthode, 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 visite http://localhost:5002/database
pour vérifier si le nom de la base de données actuelle est le même que le nom de la base de données modifiée
Problème commun
- Comment changer le nœud de configuration de lecture par défaut ?
-
Modifiez le contexte utilisateur
UserDbContext
et ajoutezConnectionStringName
des fonctionnalités :[ConnectionStringName("User")]//自定义节点名 public class UserDbContext : MasaDbContext { public DbSet<User> User { get; set; } public UserDbContext(MasaDbContextOptions options) : base(options) { } }
-
Modifier le paramètre
appsettings.json
{ "ConnectionStrings": { "User": "test"//改为从User节点读取数据库连接字符串 } }
- Est-il possible d'obtenir la chaîne de connexion à la base de données ailleurs qu'à partir du fichier de configuration ?
Il existe actuellement deux façons de modifier la chaîne de connexion à la base de données.
Méthode 1 : modifier Program.cs
et supprimer appsettings.json
la configuration de la chaîne de connexion à la base de données
-
Réviser
Program.cs
builder.Services.Configure<MasaDbConnectionOptions>(option => { option.ConnectionStrings = new ConnectionStrings(new List<KeyValuePair<string, string>>() { new("User", "test2")//其中键为节点名,与ConnectionStringName特性的Name值保持一致即可,如果未指定ConnectionStringName,则应该为DefaultConnection,值为数据库连接字符串 }); });
-
Modifier
appsettings.json
la configuration// "ConnectionStrings": { // "User": "test" // },
-
Appelez
database
la méthode pour vérifier si la base de données actuelle esttest2
Méthode 2 : Remplacer l'implémentation de IConnectionStringProvider
sum IDbConnectionStringProvider
et ajouter à DI
-
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") }; }
-
Réviser
Program.cs
builder.Services.AddSingleton<IConnectionStringProvider,CustomizeConnectionStringProvider>(); builder.Services.AddSingleton<IDbConnectionStringProvider,CustomizeDbConnectionStringProvider>();
-
Appelez
database
la méthode pour vérifier si la base de données actuelle esttest3
Résumer
Cet article explique principalement l' MasaDbContext
utilisation de base et comment utiliser la suppression réversible et le filtrage des données. Dans le prochain article, nous expliquerons MasaDbContext
comment implémenter la suppression réversible et le filtrage des données, et comment utiliser la base de données sans spécifier le caractère de lien de base de données mentionné dans cet article. Comment le temps de chaîne est-il implémenté ?
Code source de ce chapitre
Devoir05
https://github.com/zhenlei520/MasaFramework.Practice
adresse open source
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 êtes intéressé par notre framework MASA, qu'il s'agisse de contribution, d'utilisation, de publication de code, veuillez nous contacter