5. Accès aux données - Intégration EntityFramework

avant-propos

MasaFournit EntityFrameworkune 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

  1. Créez un nouveau projet vide ASP.NET Core Assignment.MasaEntityFrameworket installez Masa.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.AspNetCoreest pour la commodité Swaggerde l'utilisation de l'installation du service Microsoft.EntityFrameworkCore.InMemoryest 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'installation Microsoft.EntityFrameworkCore.Toolsconsiste à utiliser CodeFirst pour cré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 utilisateurUserDbContext.cs

    public class UserDbContext : MasaDbContext
    {
        public DbSet<User> User { get; set; }
    
        public UserDbContext(MasaDbContextOptions options) : base(options)
        {
        }
    }
    

    UserDbContextPassez à heritage MasaDbContextet ajoutez un constructeur avec un paramètre, le type de paramètre est MasaDbContextOptionsLorsqu'il y a plusieurs DbContexts dans le projet, il doit être changé en heritage MasaDbContext<TDbContext>et le type de paramètre du constructeur est changé enMasaDbContext<TDbContext>

  4. Créer une nouvelle classe AddUserRequesten tant que 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 classe HostExtensionspour 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);
            }
        }
    }
    
  6. Modifier Program.cs, ajouter Swaggerun support

    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();
    
    var app = builder.Build();
    
    app.UseSwagger();
    app.UseSwaggerUI();
    

Pas besoin Swaggerd'ajouter, utilisez Swagger juste pour tester le service d'appel, Postmanou d'autres outils Http peuvent également être utilisés

  1. Modifier Program.cs, ajouter un contexte utilisateur (emphase)

    builder.Services.AddMasaDbContext<UserDbContext>(options => 
    {
      options.Builder = (_, dbContextOptionsBuilder) => dbContextOptionsBuilder.UseInMemoryDatabase("test")
    });
    
  2. Modifié Program.cspour que le projet prenne en charge CodeFirst

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

  3. 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écutez listpour obtenir plusieurs données utilisateur, ce qui prouve que l' MasaDbContextutilisation est correcte

Comment utiliser la suppression réversible

  1. sélectionner Assignment.MasaEntityFrameworket installerMasa.Contrib.Data.Contracts.EF

    dotnet add package Masa.Contrib.Data.Contracts.EF --version 0.4.0-rc.4
    
  2. Modifiez la classe Useret implémentez ISoftDelete, 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 ISoftDeleteen œuvre et IsDeletedajoutez la prise en charge des ensembles pour les propriétés (peut être un ensemble privé ;)

  3. Modifier Program.cset activer le filtrage des données

    builder.Services.AddMasaDbContext<UserDbContext>(options =>
    {
        options.Builder = (_, dbContextOptionsBuilder) => dbContextOptionsBuilder.UseInMemoryDatabase("test");
        options.UseFilter();//启用数据过滤,完整写法:options.UseFilter(filterOptions => filterOptions.EnableSoftDelete = true);
    });
    
  4. Tester si la suppression réversible a réussi

  • Modifier Program.cs, ajouter une 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'abord la addméthode pour créer un utilisateur, puis appelez listla méthode pour obtenir une liste de tous les utilisateurs et récupérez toutes les informations d'identification, puis appelez la deleteméthode pour supprimer l'utilisateur, et enfin appelez listla 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

  1. Ajout Alld'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();
        }
    });
    
  2. Réexécutez le projet et répétez les étapes de vérification de la suppression réversible pour vous assurer que les listdonnées ne sont pas accessibles via la méthode

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

  3. Exécutez la allmé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

  1. Sélectionnez le projet Assignment.MasaEntityFrameworket 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.

  2. Modifier Program.cs, ajustez la configuration du contexte d'ajout d'utilisateur à :

    builder.Services.AddMasaDbContext<UserDbContext>(options => options.UseInMemoryDatabase().UseFilter());
    
  3. Modifiez appsettings.json, augmentez la chaîne de connexion à la base de données utilisateur :

    {
      "ConnectionStrings": {
        "DefaultConnection": "test"//更换为指定的数据库连接字符串
      }
    }
    
  4. Modifier Program.cs, ajouter databaseune 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/databasepour 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éeVérifier que la base de données est test

Problème commun

  • Comment changer le nœud de configuration de lecture par défaut ?
  1. Modifiez le contexte utilisateur UserDbContextet ajoutez ConnectionStringNamedes fonctionnalités :

    [ConnectionStringName("User")]//自定义节点名
    public class UserDbContext : MasaDbContext
    {
        public DbSet<User> User { get; set; }
    
        public UserDbContext(MasaDbContextOptions options) : base(options)
        {
        }
    }
    
  2. Modifier le paramètreappsettings.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.cset supprimer appsettings.jsonla configuration de la chaîne de connexion à la base de données

  1. RéviserProgram.cs

    builder.Services.Configure<MasaDbConnectionOptions>(option =>
    {
        option.ConnectionStrings = new ConnectionStrings(new List<KeyValuePair<string, string>>()
        {
            new("User", "test2")//其中键为节点名,与ConnectionStringName特性的Name值保持一致即可,如果未指定ConnectionStringName,则应该为DefaultConnection,值为数据库连接字符串
        });
    });
    
  2. Modifier appsettings.jsonla configuration

    //  "ConnectionStrings": {
    //    "User": "test"
    //  },
    
  3. Appelez databasela méthode pour vérifier si la base de données actuelle esttest2

Vérifiez que la base de données est test2

Méthode 2 : Remplacer l'implémentation de IConnectionStringProvidersum IDbConnectionStringProvideret ajouter à DI

  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. RéviserProgram.cs

    builder.Services.AddSingleton<IConnectionStringProvider,CustomizeConnectionStringProvider>();
    builder.Services.AddSingleton<IDbConnectionStringProvider,CustomizeDbConnectionStringProvider>();
    
  4. Appelez databasela méthode pour vérifier si la base de données actuelle esttest3 Vérifiez que la base de données est test3

Résumer

Cet article explique principalement l' MasaDbContextutilisation de base et comment utiliser la suppression réversible et le filtrage des données. Dans le prochain article, nous expliquerons MasaDbContextcomment 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

16373211753064.png

{{o.name}}
{{m.name}}

Je suppose que tu aimes

Origine my.oschina.net/u/5447363/blog/5549631
conseillé
Classement