当前位置:网站首页>Accès aux données - intégration du cadre d'entité

Accès aux données - intégration du cadre d'entité

2022-07-05 16:27:00 Lei... Lei.

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

  1. NouveauASP.NET Core Projet videAssignment.MasaEntityFramework,Et installerMasa.Contrib.Data.EntityFrameworkCoreSwashbuckle.AspNetCoreMicrosoft.EntityFrameworkCore.InMemoryMicrosoft.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
    

    InstallationSwashbuckle.AspNetCore Pour faciliter le passage Swagger Pour 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ées

  2. Nouvelle classeUser

    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;
        }
    }
    
  3. Nouveau contexte utilisateur UserDbContext.cs

    public 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éritage MasaDbContext<TDbContext>, Le type de paramètre du constructeur a été changé en MasaDbContext<TDbContext>

  4. Nouvelle classeAddUserRequest Comme paramètre pour ajouter un utilisateur

    public class AddUserRequest
    {
        public string Name { get; set; }
    
        public uint Gender { get; set; }
    
        public DateTime BirthDay { get; set; }
    }
    
  5. Nouvelle classeHostExtensionsPour 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);
            }
        }
    }
    
  6. ModifierProgram.cs,NouveauSwaggerSoutien

    builder.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 ,UtiliserPostmanOu autreHttpLes outils aussi.

  1. ModifierProgram.cs,Ajouter un contexte utilisateur(Points saillants)

    builder.Services.AddMasaDbContext<UserDbContext>(options => 
    {
      options.Builder = (_, dbContextOptionsBuilder) => dbContextOptionsBuilder.UseInMemoryDatabase("test")
    });
    
  2. ModifierProgram.cs,Faire en sorte que le projet appuieCodeFirst

    app.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

  3. TestsMasaDbContext,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 œuvreadd 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

  1. SélectionnerAssignment.MasaEntityFrameworkEt installerMasa.Contrib.Data.Contracts.EF

    dotnet add package Masa.Contrib.Data.Contracts.EF --version 0.4.0-rc.4
    
  2. Modifier la classeUser,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;)

  3. ModifierProgram.cs, Et activer le filtrage des données

    builder.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);
    });
    
  4. Tester si la suppression douce a réussi

  • ModifierProgram.cs, Ajouter une nouvelle méthode de suppression

    app.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

  1. NouveauAll 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();
        }
    });
    
  2. Relancer le projet, Répéter l'étape de validation de la suppression souple ,Assurez - vous quelist Méthode impossible d'accéder aux données

    La 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

  3. Mise en œuvreallMé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

  1. Éléments sélectionnésAssignment.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.

  2. ModifierProgram.cs, Ajuster ajouter un contexte utilisateur configuré pour :

    builder.Services.AddMasaDbContext<UserDbContext>(options => options.UseInMemoryDatabase().UseFilter());
    
  3. Modifierappsettings.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 
      }
    }
    
  4. ModifierProgram.cs,NouveaudatabaseMéthodes, Vérifier que la base de données actuelle est test

    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
 La base de données de validation est test

Questions fréquemment posées

  • Comment modifier le noeud de configuration pour la lecture par défaut ?
  1. 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)
        {
        }
    }
    
  2. Modifier la configurationappsettings.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

  1. ModifierProgram.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 
        });
    });
    
  2. Modifierappsettings.jsonConfiguration

    //  "ConnectionStrings": {
    //    "User": "test"
    //  },
    
  3. AppelezdatabaseMéthodes, Vérifier que la base de données actuelle est test2

 La base de données de validation est test2

Méthodes2: RéécritureIConnectionStringProviderEtIDbConnectionStringProvider Mise en œuvre et ajout à DIMoyenne

  1. Nouvelle classeCustomizeConnectionStringProvider

    public class CustomizeConnectionStringProvider : IConnectionStringProvider
    {
        public Task<string> GetConnectionStringAsync(string name = "DefaultConnection") => Task.FromResult    (GetConnectionString(name));
    
        public string GetConnectionString(string name = "DefaultConnection") => "test3";
    }
    
  2. Nouvelle classeCustomizeDbConnectionStringProvider

    public class CustomizeDbConnectionStringProvider : IDbConnectionStringProvider
    {
        public List<MasaDbContextConfigurationOptions> DbContextOptionsList { get; } = new()
        {
            new MasaDbContextConfigurationOptions("test3")
        };
    }
    
  3. ModifierProgram.cs

    builder.Services.AddSingleton<IConnectionStringProvider,CustomizeConnectionStringProvider>();
    builder.Services.AddSingleton<IDbConnectionStringProvider,CustomizeDbConnectionStringProvider>();
    
  4. AppelezdatabaseMéthodes, Vérifier que la base de données actuelle est test3
     La base de données de validation est test3

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

16373211753064.png

原网站

版权声明
本文为[Lei... Lei.]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/186/202207051549458259.html