5.データアクセス-EntityFramework統合

序文

MasaEntityFrameworkデータに基づくデータ統合を提供し、データフィルタリングとソフト削除の機能を提供します。以下では、その使用方法を紹介します。

MasaDbContext入門

  • .Net6.0をインストールします
  1. 新しいASP.NETCoreの空のプロジェクトを作成し、、、、インストールAssignment.MasaEntityFrameworkMasa.Contrib.Data.EntityFrameworkCoreますSwashbuckle.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
    

    インストールはサービス操作のSwashbuckle.AspNetCore便宜のためです。インストールはインメモリデータベースを使用します。他のデータベースを使用する必要がある場合は、対応するパッケージを自分でインストールしてください。インストールはCodeFirstを使用してデータベースを作成します。SwaggerMicrosoft.EntityFrameworkCore.InMemoryMicrosoft.EntityFrameworkCore.Tools

  2. 新しいクラス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;
        }
    }
    
  3. 新しいユーザーコンテキストUserDbContext.cs

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

    UserDbContext継承MasaDbContextに変更し、パラメーターを持つコンストラクターを追加します。パラメーターの種類はMasaDbContextOptions次のとおりです。プロジェクトに複数のDbContextがある場合は、継承に変更する必要がMasaDbContext<TDbContext>あり、コンストラクターのパラメーターの種類は次のように変更されます。MasaDbContext<TDbContext>

  4. AddUserRequestユーザーを追加するためのパラメーターとして新しいクラスを作成します

    public class AddUserRequest
    {
        public string Name { get; set; }
    
        public uint Gender { get; set; }
    
        public DateTime BirthDay { get; set; }
    }
    
  5. データベースを移行するための新しいクラスHostExtensions(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. 変更、サポートProgram.csの追加Swagger

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

追加する必要Swaggerはありません。呼び出しサービスをテストするためだけにSwaggerを使用するPostmanか、他のHttpツールを使用することもできます。

  1. 変更Program.cs、ユーザーコンテキストの追加(強調)

    builder.Services.AddMasaDbContext<UserDbContext>(options => 
    {
      options.Builder = (_, dbContextOptionsBuilder) => dbContextOptionsBuilder.UseInMemoryDatabase("test")
    });
    
  2. Program.csプロジェクトがCodeFirstをサポートするように変更されました

    app.MigrateDbContext<UserDbContext>((context, services) =>
    {
    });
    

    CodeFirstは必須ではなく、コード生成をサポートしないデータベースを追加する必要もありません。

  3. テストMasaDbContext、変更Program.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();
    });
    

    自分でプロジェクトをadd実行し、実行後に新しいユーザーを作成し、実行listして複数のユーザーデータを取得します。これにより、MasaDbContext使用法が正しいことが証明されます。

ソフト削除の使用方法

  1. 選択Assignment.MasaEntityFrameworkしてインストールMasa.Contrib.Data.Contracts.EF

    dotnet add package Masa.Contrib.Data.Contracts.EF --version 0.4.0-rc.4
    
  2. クラスUserを変更して実装するISoftDeleteと、コードは次のように変更されます。

    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;
        }
    }
    

    実装ISoftDeleteを追加しIsDeleted、プロパティのセットサポートを追加します(プライベートセットにすることができます;)

  3. Program.csデータフィルタリングを変更して有効にする

    builder.Services.AddMasaDbContext<UserDbContext>(options =>
    {
        options.Builder = (_, dbContextOptionsBuilder) => dbContextOptionsBuilder.UseInMemoryDatabase("test");
        options.UseFilter();//启用数据过滤,完整写法:options.UseFilter(filterOptions => filterOptions.EnableSoftDelete = true);
    });
    
  4. ソフト削除が成功したかどうかをテストします

  • 変更Program.cs、削除メソッドの追加

    app.MapDelete("/delete", (UserDbContext dbContext, int id) =>
    {
        var user = dbContext.Set<User>().First(u => u.Id == id);
        dbContext.Set<User>().Remove(user);
        dbContext.SaveChanges();
    });
    

最後に、最初にaddメソッドを呼び出してユーザーを作成し、次にlistメソッドを呼び出してすべてのユーザーのリストを取得し、ID情報を取得します。次に、deleteメソッドを呼び出してユーザーを削除し、最後listにメソッドを呼び出して、取得したIDが存在するかどうかを確認します。 、ソフトウェアを検証するために。削除が有効かどうか。

ソフト削除フィルタリングを一時的に無効にする方法

デフォルトのクエリでは、削除済みとマークされたデータはフィルタリングされ、クエリされなくなりますが、すべてのデータをクエリする必要があるシナリオもあります。この場合、データフィルタリングが必要になります。IDataFilter

  1. Allすべてのデータ(削除対象としてマークされたデータを含む)を照会するためのメソッドが追加されました

    app.MapGet("/all", (UserDbContext dbContext, [FromServices] IDataFilter dataFilter) =>
    {
        //通过DI获取到IDataFilter,并调用其Disable方法可临时禁用ISoftDelete条件过滤
        using (dataFilter.Disable<ISoftDelete>())
        {
            return dbContext.Set<User>().ToList();
        }
    });
    
  2. プロジェクトを再実行し、ソフト削除の検証手順を繰り返しlistて、メソッドを介してデータにアクセスできないことを確認します

    検証ソフト削除ステップを繰り返し実行する理由は、この例ではインメモリデータベースを使用しているためです。プロジェクトが停止すると、すべてのデータが空になります。再実行は、データが存在し、削除のマークが付けられていることを確認するためです。 。

  3. メソッドを実行し、allすべてのデータを取得して、IDに対応するユーザーデータが存在するかどうかを確認します

構成ファイルからデータベース接続文字列を取得します

  1. プロジェクトAssignment.MasaEntityFrameworkを選択してインストールしますMasa.Contrib.Data.EntityFrameworkCore.InMemory

    dotnet add package Masa.Contrib.Data.EntityFrameworkCore.InMemory --version 0.4.0-rc.4
    

    Masa.Contrib.Data.EntityFrameworkCore.SqlServer必要に応じて、 (SqlServer)、Masa.Contrib.Data.EntityFrameworkCore.Pomelo.MySql(Pomeloが提供するMySql)、Masa.Contrib.Data.EntityFrameworkCore.Oracle(Oracle)などの対応するデータベースパッケージをインストールします。

  2. 変更Program.csし、ユーザーコンテキストの追加構成を次のように調整します。

    builder.Services.AddMasaDbContext<UserDbContext>(options => options.UseInMemoryDatabase().UseFilter());
    
  3. 変更appsettings.jsonし、ユーザーデータベース接続文字列を増やします。

    {
      "ConnectionStrings": {
        "DefaultConnection": "test"//更换为指定的数据库连接字符串
      }
    }
    
  4. 変更し、メソッドをProgram.cs追加し、現在のデータベースがdatabasetest

    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 "";
    });
    

http://localhost:5002/database現在のデータベース名が変更されたデータベース名と同じであるかどうかを確認するための最後の訪問データベースがテストされていることを確認します

一般的な問題

  • デフォルトの読み取り構成ノードを変更するにはどうすればよいですか?
  1. ユーザーコンテキストUserDbContextを変更し、機能を追加ConnectionStringNameします。

    [ConnectionStringName("User")]//自定义节点名
    public class UserDbContext : MasaDbContext
    {
        public DbSet<User> User { get; set; }
    
        public UserDbContext(MasaDbContextOptions options) : base(options)
        {
        }
    }
    
  2. 設定を変更するappsettings.json

    {
      "ConnectionStrings": {
        "User": "test"//改为从User节点读取数据库连接字符串
      }
    }
    
  • 構成ファイル以外の場所からデータベース接続文字列を取得することはサポートされていますか?

現在、データベース接続文字列を変更する方法は2つあります。

方法1:データベース接続文字列の構成を変更Program.csおよび削除しますappsettings.json

  1. 改訂Program.cs

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

    //  "ConnectionStrings": {
    //    "User": "test"
    //  },
    
  3. databaseメソッドを呼び出して、現在のデータベースがtest2

データベースがtest2であることを確認します

IConnectionStringProvider方法2:合計の実装をオーバーライドIDbConnectionStringProviderしてDIに追加する

  1. 新しいクラスCustomizeConnectionStringProvider

    public class CustomizeConnectionStringProvider : IConnectionStringProvider
    {
        public Task<string> GetConnectionStringAsync(string name = "DefaultConnection") => Task.FromResult    (GetConnectionString(name));
    
        public string GetConnectionString(string name = "DefaultConnection") => "test3";
    }
    
  2. 新しいクラスCustomizeDbConnectionStringProvider

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

    builder.Services.AddSingleton<IConnectionStringProvider,CustomizeConnectionStringProvider>();
    builder.Services.AddSingleton<IDbConnectionStringProvider,CustomizeDbConnectionStringProvider>();
    
  4. databaseメソッドを呼び出して、現在のデータベースがtest3 データベースがtest3であることを確認します

要約する

この記事では、主にソフト削除とデータフィルタリングのMasaDbContext基本的な使用方法と使用方法について説明します。次の記事では、MasaDbContextソフト削除とデータフィルタリングの実装方法、およびこの記事で説明したデータベースリンク文字を指定せずにデータベースを使用する方法について説明します。 。文字列時間はどのように実装されますか?

この章のソースコード

割り当て05

https://github.com/zhenlei520/MasaFramework.Practice

オープンソースアドレス

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

MASAフレームワークに興味がある場合は、コードの提供、使用、発行のいずれであっても、お問い合わせください。

16373211753064.png

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

おすすめ

転載: my.oschina.net/u/5447363/blog/5549631