序文
Masa
EntityFramework
データに基づくデータ統合を提供し、データフィルタリングとソフト削除の機能を提供します。以下では、その使用方法を紹介します。
MasaDbContext入門
- .Net6.0をインストールします
-
新しいASP.NETCoreの空のプロジェクトを作成し、、、、をインストール
Assignment.MasaEntityFramework
し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
インストールはサービス操作の
Swashbuckle.AspNetCore
便宜のためです。インストールはインメモリデータベースを使用します。他のデータベースを使用する必要がある場合は、対応するパッケージを自分でインストールしてください。インストールはCodeFirstを使用してデータベースを作成します。Swagger
Microsoft.EntityFrameworkCore.InMemory
Microsoft.EntityFrameworkCore.Tools
-
新しいクラス
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; } }
-
新しいユーザーコンテキスト
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>
-
AddUserRequest
ユーザーを追加するためのパラメーターとして新しいクラスを作成しますpublic class AddUserRequest { public string Name { get; set; } public uint Gender { get; set; } public DateTime BirthDay { get; set; } }
-
データベースを移行するための新しいクラス
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); } } }
-
変更、サポート
Program.cs
の追加Swagger
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); app.UseSwagger(); app.UseSwaggerUI();
追加する必要
Swagger
はありません。呼び出しサービスをテストするためだけにSwaggerを使用するPostman
か、他のHttpツールを使用することもできます。
-
変更
Program.cs
、ユーザーコンテキストの追加(強調)builder.Services.AddMasaDbContext<UserDbContext>(options => { options.Builder = (_, dbContextOptionsBuilder) => dbContextOptionsBuilder.UseInMemoryDatabase("test") });
-
Program.cs
プロジェクトがCodeFirstをサポートするように変更されましたapp.MigrateDbContext<UserDbContext>((context, services) => { });
CodeFirstは必須ではなく、コード生成をサポートしないデータベースを追加する必要もありません。
-
テスト
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
使用法が正しいことが証明されます。
ソフト削除の使用方法
-
選択
Assignment.MasaEntityFramework
してインストールMasa.Contrib.Data.Contracts.EF
dotnet add package Masa.Contrib.Data.Contracts.EF --version 0.4.0-rc.4
-
クラス
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
、プロパティのセットサポートを追加します(プライベートセットにすることができます;) -
Program.cs
データフィルタリングを変更して有効にするbuilder.Services.AddMasaDbContext<UserDbContext>(options => { options.Builder = (_, dbContextOptionsBuilder) => dbContextOptionsBuilder.UseInMemoryDatabase("test"); options.UseFilter();//启用数据过滤,完整写法:options.UseFilter(filterOptions => filterOptions.EnableSoftDelete = true); });
-
ソフト削除が成功したかどうかをテストします
-
変更
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
-
All
すべてのデータ(削除対象としてマークされたデータを含む)を照会するためのメソッドが追加されましたapp.MapGet("/all", (UserDbContext dbContext, [FromServices] IDataFilter dataFilter) => { //通过DI获取到IDataFilter,并调用其Disable方法可临时禁用ISoftDelete条件过滤 using (dataFilter.Disable<ISoftDelete>()) { return dbContext.Set<User>().ToList(); } });
-
プロジェクトを再実行し、ソフト削除の検証手順を繰り返し
list
て、メソッドを介してデータにアクセスできないことを確認します検証ソフト削除ステップを繰り返し実行する理由は、この例ではインメモリデータベースを使用しているためです。プロジェクトが停止すると、すべてのデータが空になります。再実行は、データが存在し、削除のマークが付けられていることを確認するためです。 。
-
メソッドを実行し、
all
すべてのデータを取得して、IDに対応するユーザーデータが存在するかどうかを確認します
構成ファイルからデータベース接続文字列を取得します
-
プロジェクト
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)などの対応するデータベースパッケージをインストールします。 -
変更
Program.cs
し、ユーザーコンテキストの追加構成を次のように調整します。builder.Services.AddMasaDbContext<UserDbContext>(options => options.UseInMemoryDatabase().UseFilter());
-
変更
appsettings.json
し、ユーザーデータベース接続文字列を増やします。{ "ConnectionStrings": { "DefaultConnection": "test"//更换为指定的数据库连接字符串 } }
-
変更し、メソッドを
Program.cs
追加し、現在のデータベースがdatabase
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 ""; });
http://localhost:5002/database
現在のデータベース名が変更されたデータベース名と同じであるかどうかを確認するための最後の訪問
一般的な問題
- デフォルトの読み取り構成ノードを変更するにはどうすればよいですか?
-
ユーザーコンテキスト
UserDbContext
を変更し、機能を追加ConnectionStringName
します。[ConnectionStringName("User")]//自定义节点名 public class UserDbContext : MasaDbContext { public DbSet<User> User { get; set; } public UserDbContext(MasaDbContextOptions options) : base(options) { } }
-
設定を変更する
appsettings.json
{ "ConnectionStrings": { "User": "test"//改为从User节点读取数据库连接字符串 } }
- 構成ファイル以外の場所からデータベース接続文字列を取得することはサポートされていますか?
現在、データベース接続文字列を変更する方法は2つあります。
方法1:データベース接続文字列の構成を変更Program.cs
および削除しますappsettings.json
-
改訂
Program.cs
builder.Services.Configure<MasaDbConnectionOptions>(option => { option.ConnectionStrings = new ConnectionStrings(new List<KeyValuePair<string, string>>() { new("User", "test2")//其中键为节点名,与ConnectionStringName特性的Name值保持一致即可,如果未指定ConnectionStringName,则应该为DefaultConnection,值为数据库连接字符串 }); });
-
appsettings.json
構成を変更する// "ConnectionStrings": { // "User": "test" // },
-
database
メソッドを呼び出して、現在のデータベースがtest2
IConnectionStringProvider
方法2:合計の実装をオーバーライドIDbConnectionStringProvider
してDIに追加する
-
新しいクラス
CustomizeConnectionStringProvider
public class CustomizeConnectionStringProvider : IConnectionStringProvider { public Task<string> GetConnectionStringAsync(string name = "DefaultConnection") => Task.FromResult (GetConnectionString(name)); public string GetConnectionString(string name = "DefaultConnection") => "test3"; }
-
新しいクラス
CustomizeDbConnectionStringProvider
public class CustomizeDbConnectionStringProvider : IDbConnectionStringProvider { public List<MasaDbContextConfigurationOptions> DbContextOptionsList { get; } = new() { new MasaDbContextConfigurationOptions("test3") }; }
-
改訂
Program.cs
builder.Services.AddSingleton<IConnectionStringProvider,CustomizeConnectionStringProvider>(); builder.Services.AddSingleton<IDbConnectionStringProvider,CustomizeDbConnectionStringProvider>();
-
database
メソッドを呼び出して、現在のデータベースが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フレームワークに興味がある場合は、コードの提供、使用、発行のいずれであっても、お問い合わせください。