Skip to content
This repository has been archived by the owner on Aug 1, 2022. It is now read-only.

Commit

Permalink
feat(EntityFramework): EntityFramework adds soft delete (#30)
Browse files Browse the repository at this point in the history
### Feat:
* EntityFramework: adds soft delete and Support data filtering (#30)
* EntityFramework: Newly added Cosmos, InMemory, MySql, Oracle, MySql, PostgreSql, Sqlite, SqlServer extensions, easier to use (#30)

### Perf
* Expressions: Extend And 、Or methods (#30)

### Test:
* EntityFramework: adds unit tests (#30)

### Refactor
* EntityFramework: refactor MasaDbContext and MasaDbContextOptions (#30)
  • Loading branch information
zhenlei520 committed Mar 21, 2022
1 parent c79d0b2 commit c2b6af7
Show file tree
Hide file tree
Showing 75 changed files with 1,649 additions and 103 deletions.
63 changes: 63 additions & 0 deletions Masa.Utils.sln
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,24 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masa.Utils.Caller.Integrate
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Masa.Utils.Caller.Tests", "test\Masa.Utils.Caller.Tests\Masa.Utils.Caller.Tests.csproj", "{276B4CDC-BD8F-4563-A82A-B46724C9F4B0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masa.Utils.Data.EntityFrameworkCore.SqlServer", "src\Data\Masa.Utils.Data.EntityFrameworkCore.SqlServer\Masa.Utils.Data.EntityFrameworkCore.SqlServer.csproj", "{9004B687-3EB7-4156-A3F7-078A342F2BEF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masa.Utils.Data.EntityFrameworkCore.Sqlite", "src\Data\Masa.Utils.Data.EntityFrameworkCore.Sqlite\Masa.Utils.Data.EntityFrameworkCore.Sqlite.csproj", "{4C3C99D6-A832-4D14-B1C8-54B6E0780F24}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masa.Utils.Data.EntityFrameworkCore.MySql", "src\Data\Masa.Utils.Data.EntityFrameworkCore.MySql\Masa.Utils.Data.EntityFrameworkCore.MySql.csproj", "{8AE29CEB-89D3-4AE3-8F97-D03D19F0B6FB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masa.Utils.Data.EntityFrameworkCore.InMemory", "src\Data\Masa.Utils.Data.EntityFrameworkCore.InMemory\Masa.Utils.Data.EntityFrameworkCore.InMemory.csproj", "{95A1CAC2-42F5-4916-99D2-64D9C830B1B3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masa.Utils.Data.EntityFrameworkCore.Oracle", "src\Data\Masa.Utils.Data.EntityFrameworkCore.Oracle\Masa.Utils.Data.EntityFrameworkCore.Oracle.csproj", "{6FFA2D43-D011-4E1B-B2DA-A6DF2816AA02}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masa.Utils.Data.EntityFrameworkCore.PostgreSql", "src\Data\Masa.Utils.Data.EntityFrameworkCore.PostgreSql\Masa.Utils.Data.EntityFrameworkCore.PostgreSql.csproj", "{D682F08B-6586-4C33-815D-8F98C50A0843}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Masa.Utils.Data.EntityFrameworkCore.Pomelo.MySql", "src\Data\Masa.Utils.Data.EntityFrameworkCore.Pomelo.MySql\Masa.Utils.Data.EntityFrameworkCore.Pomelo.MySql.csproj", "{2AB5DFD8-B537-4066-8366-E3F371BD5EE2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Masa.Utils.Data.EntityFrameworkCore.Cosmos", "src\Data\Masa.Utils.Data.EntityFrameworkCore.Cosmos\Masa.Utils.Data.EntityFrameworkCore.Cosmos.csproj", "{B8CB480B-2608-46A8-8528-37EDD5E1EC1E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Masa.Utils.Data.EntityFrameworkCore.Tests", "test\Masa.Utils.Data.EntityFrameworkCore.Tests\Masa.Utils.Data.EntityFrameworkCore.Tests.csproj", "{41C2A208-4DF8-4BD0-B844-77E6F58FE000}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -203,6 +221,42 @@ Global
{276B4CDC-BD8F-4563-A82A-B46724C9F4B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{276B4CDC-BD8F-4563-A82A-B46724C9F4B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{276B4CDC-BD8F-4563-A82A-B46724C9F4B0}.Release|Any CPU.Build.0 = Release|Any CPU
{9004B687-3EB7-4156-A3F7-078A342F2BEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9004B687-3EB7-4156-A3F7-078A342F2BEF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9004B687-3EB7-4156-A3F7-078A342F2BEF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9004B687-3EB7-4156-A3F7-078A342F2BEF}.Release|Any CPU.Build.0 = Release|Any CPU
{4C3C99D6-A832-4D14-B1C8-54B6E0780F24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4C3C99D6-A832-4D14-B1C8-54B6E0780F24}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4C3C99D6-A832-4D14-B1C8-54B6E0780F24}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4C3C99D6-A832-4D14-B1C8-54B6E0780F24}.Release|Any CPU.Build.0 = Release|Any CPU
{8AE29CEB-89D3-4AE3-8F97-D03D19F0B6FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8AE29CEB-89D3-4AE3-8F97-D03D19F0B6FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8AE29CEB-89D3-4AE3-8F97-D03D19F0B6FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8AE29CEB-89D3-4AE3-8F97-D03D19F0B6FB}.Release|Any CPU.Build.0 = Release|Any CPU
{95A1CAC2-42F5-4916-99D2-64D9C830B1B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{95A1CAC2-42F5-4916-99D2-64D9C830B1B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{95A1CAC2-42F5-4916-99D2-64D9C830B1B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{95A1CAC2-42F5-4916-99D2-64D9C830B1B3}.Release|Any CPU.Build.0 = Release|Any CPU
{6FFA2D43-D011-4E1B-B2DA-A6DF2816AA02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6FFA2D43-D011-4E1B-B2DA-A6DF2816AA02}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6FFA2D43-D011-4E1B-B2DA-A6DF2816AA02}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6FFA2D43-D011-4E1B-B2DA-A6DF2816AA02}.Release|Any CPU.Build.0 = Release|Any CPU
{D682F08B-6586-4C33-815D-8F98C50A0843}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D682F08B-6586-4C33-815D-8F98C50A0843}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D682F08B-6586-4C33-815D-8F98C50A0843}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D682F08B-6586-4C33-815D-8F98C50A0843}.Release|Any CPU.Build.0 = Release|Any CPU
{2AB5DFD8-B537-4066-8366-E3F371BD5EE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2AB5DFD8-B537-4066-8366-E3F371BD5EE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2AB5DFD8-B537-4066-8366-E3F371BD5EE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2AB5DFD8-B537-4066-8366-E3F371BD5EE2}.Release|Any CPU.Build.0 = Release|Any CPU
{B8CB480B-2608-46A8-8528-37EDD5E1EC1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B8CB480B-2608-46A8-8528-37EDD5E1EC1E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B8CB480B-2608-46A8-8528-37EDD5E1EC1E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B8CB480B-2608-46A8-8528-37EDD5E1EC1E}.Release|Any CPU.Build.0 = Release|Any CPU
{41C2A208-4DF8-4BD0-B844-77E6F58FE000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{41C2A208-4DF8-4BD0-B844-77E6F58FE000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{41C2A208-4DF8-4BD0-B844-77E6F58FE000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{41C2A208-4DF8-4BD0-B844-77E6F58FE000}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -243,7 +297,16 @@ Global
{1A8FBE3D-B004-4D25-8FE0-A3632A0FDE9E} = {4F908878-0EB8-43E4-96E4-8B1F32E9B635}
{4B351F95-5919-46A9-A02F-F4409C9EA79A} = {4F908878-0EB8-43E4-96E4-8B1F32E9B635}
{D5E09920-081B-478C-B77B-EAB77931F47D} = {4F908878-0EB8-43E4-96E4-8B1F32E9B635}
{9004B687-3EB7-4156-A3F7-078A342F2BEF} = {F844C2A1-C36D-400E-A0D8-7658EF9C3B93}
{276B4CDC-BD8F-4563-A82A-B46724C9F4B0} = {4F908878-0EB8-43E4-96E4-8B1F32E9B635}
{4C3C99D6-A832-4D14-B1C8-54B6E0780F24} = {F844C2A1-C36D-400E-A0D8-7658EF9C3B93}
{8AE29CEB-89D3-4AE3-8F97-D03D19F0B6FB} = {F844C2A1-C36D-400E-A0D8-7658EF9C3B93}
{95A1CAC2-42F5-4916-99D2-64D9C830B1B3} = {F844C2A1-C36D-400E-A0D8-7658EF9C3B93}
{6FFA2D43-D011-4E1B-B2DA-A6DF2816AA02} = {F844C2A1-C36D-400E-A0D8-7658EF9C3B93}
{D682F08B-6586-4C33-815D-8F98C50A0843} = {F844C2A1-C36D-400E-A0D8-7658EF9C3B93}
{2AB5DFD8-B537-4066-8366-E3F371BD5EE2} = {F844C2A1-C36D-400E-A0D8-7658EF9C3B93}
{B8CB480B-2608-46A8-8528-37EDD5E1EC1E} = {F844C2A1-C36D-400E-A0D8-7658EF9C3B93}
{41C2A208-4DF8-4BD0-B844-77E6F58FE000} = {4F908878-0EB8-43E4-96E4-8B1F32E9B635}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {D7DAA0E6-098F-4B18-8775-64FDA96F1FF0}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
namespace Masa.Utils.Data.EntityFrameworkCore.Cosmos.Internal;

internal static class Parser
{
public static Dictionary<string, string> ToDictionary(this string connectionString)
{
if (string.IsNullOrEmpty(connectionString))
throw new ArgumentException("Cosmos: empty database connection string", nameof(connectionString));

Dictionary<string, string> dictionary = new();
foreach (var item in connectionString.Split(';'))
{
if (string.IsNullOrEmpty(item))
continue;

if (item.Split('=').Length != 2)
throw new ArgumentException("Cosmos: Bad database connection string");

dictionary.Add(item.Split('=')[0], item.Split('=')[1]);
}
return dictionary;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Cosmos" Version="6.0.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\Masa.Utils.Data.EntityFrameworkCore\Masa.Utils.Data.EntityFrameworkCore.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
namespace Masa.Utils.Data.EntityFrameworkCore.Cosmos;

public static class MasaDbContextOptionsBuilderExtensions
{
public static MasaDbContextOptionsBuilder UseCosmos(
this MasaDbContextOptionsBuilder builder,
Action<CosmosDbContextOptionsBuilder>? cosmosOptionsAction = null)
{
var connectionStringProvider = builder.ServiceProvider.GetRequiredService<IConnectionStringProvider>();
var configurationDic = connectionStringProvider.GetConnectionString().ToDictionary();

if (!configurationDic.TryGetValue("Database", out string? databaseName))
throw new ArgumentException("Cosmos: Bad database connection string, Failed to get [Database] name");

if (configurationDic.TryGetValue("ConnectionString", out string? connectionString))
return builder.UseCosmos(connectionString, databaseName, cosmosOptionsAction);

if (!configurationDic.TryGetValue("AccountKey", out string? accountKey) ||
!configurationDic.TryGetValue("AccountEndpoint", out string? accountEndpoint))
throw new ArgumentException("Cosmos: Bad database connection string, Failed to get [AccountKey] name or [AccountEndpoint] name");

return builder.UseCosmos(accountEndpoint, accountKey, databaseName, cosmosOptionsAction);
}

public static MasaDbContextOptionsBuilder UseCosmos(
this MasaDbContextOptionsBuilder builder,
string accountEndpoint,
string accountKey,
string databaseName,
Action<CosmosDbContextOptionsBuilder>? cosmosOptionsAction = null)
{
builder.DbContextOptionsBuilder.UseCosmos(accountEndpoint, accountKey, databaseName, cosmosOptionsAction);
return builder;
}

public static MasaDbContextOptionsBuilder UseCosmos(
this MasaDbContextOptionsBuilder builder,
string connectionString,
string databaseName,
Action<CosmosDbContextOptionsBuilder>? cosmosOptionsAction = null)
{
builder.DbContextOptionsBuilder.UseCosmos(connectionString, databaseName, cosmosOptionsAction);
return builder;
}
}
34 changes: 34 additions & 0 deletions src/Data/Masa.Utils.Data.EntityFrameworkCore.Cosmos/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
[](README.zh-CN.md) | EN

## Masa.Utils.Data.EntityFrameworkCore.Cosmos

## Example:

```c#
Install-Package Masa.Utils.Data.EntityFrameworkCore.Cosmos
```

##### Usage 1:

1. Configure appsettings.json

``` appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "AccountKey=AccountKey;AccountEndpoint=AccountEndpoint;Database=Database"// or "ConnectionString=ConnectionString;Database=Database"
}
}
```

2. Using MasaDbContext

``` C#
builder.Services.AddMasaDbContext<CustomDbContext>(optionsBuilder => optionsBuilder.UseSoftDelete().UseCosmos());
```

##### Usage 2:

``` C#
builder.Services.AddMasaDbContext<CustomDbContext>(optionsBuilder => optionsBuilder.UseSoftDelete().UseCosmos($"{accountEndpoint}",$"{accountKey}",$"{databaseName}"));
//builder.Services.AddMasaDbContext<CustomDbContext>(optionsBuilder => optionsBuilder.UseSoftDelete().UseCosmos($"{connectionString}",$"{databaseName}"));
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
中 | [EN](README.md)

## Masa.Utils.Data.EntityFrameworkCore.Cosmos

## 用例:

```c#
Install-Package Masa.Utils.Data.EntityFrameworkCore.Cosmos
```

#### 用法1:

1. 配置appsettings.json

``` appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "AccountKey=AccountKey;AccountEndpoint=AccountEndpoint;Database=Database"//或"ConnectionString=ConnectionString;Database=Database"
}
}
```

2. 使用MasaDbContext

``` C#
builder.Services.AddMasaDbContext<CustomDbContext>(optionsBuilder => optionsBuilder.UseSoftDelete().UseCosmos());
```

#### 用法2:

``` C#
builder.Services.AddMasaDbContext<CustomDbContext>(optionsBuilder => optionsBuilder.UseSoftDelete().UseCosmos($"{accountEndpoint}",$"{accountKey}",$"{databaseName}"));
//builder.Services.AddMasaDbContext<CustomDbContext>(optionsBuilder => optionsBuilder.UseSoftDelete().UseCosmos($"{connectionString}",$"{databaseName}"));
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
global using Masa.Utils.Data.EntityFrameworkCore.Cosmos.Internal;
global using Microsoft.EntityFrameworkCore;
global using Microsoft.EntityFrameworkCore.Infrastructure;
global using Microsoft.Extensions.DependencyInjection;
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\Masa.Utils.Data.EntityFrameworkCore\Masa.Utils.Data.EntityFrameworkCore.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="6.0.0" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
namespace Masa.Utils.Data.EntityFrameworkCore.InMemory;

public static class MasaDbContextOptionsBuilderExtensions
{
public static MasaDbContextOptionsBuilder UseInMemoryDatabase(
this MasaDbContextOptionsBuilder builder,
Action<InMemoryDbContextOptionsBuilder>? inMemoryOptionsAction = null)
{
var connectionStringProvider = builder.ServiceProvider.GetRequiredService<IConnectionStringProvider>();
return builder.UseInMemoryDatabase(connectionStringProvider.GetConnectionString(), inMemoryOptionsAction);
}

public static MasaDbContextOptionsBuilder UseInMemoryDatabase(
this MasaDbContextOptionsBuilder builder,
string databaseName,
Action<InMemoryDbContextOptionsBuilder>? inMemoryOptionsAction = null)
{
builder.DbContextOptionsBuilder.UseInMemoryDatabase(databaseName, inMemoryOptionsAction);
return builder;
}
}
33 changes: 33 additions & 0 deletions src/Data/Masa.Utils.Data.EntityFrameworkCore.InMemory/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
[](README.zh-CN.md) | EN

## Masa.Utils.Data.EntityFrameworkCore.InMemory

## Example:

```c#
Install-Package Masa.Utils.Data.EntityFrameworkCore.InMemory
```

##### Usage 1:

1. Configure appsettings.json

``` appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "identity"
}
}
```

2. Using MasaDbContext

``` C#
builder.Services.AddMasaDbContext<CustomDbContext>(optionsBuilder => optionsBuilder.UseSoftDelete().UseInMemoryDatabase());
```

##### Usage 2:

``` C#
builder.Services.AddMasaDbContext<CustomDbContext>(optionsBuilder => optionsBuilder.UseSoftDelete().UseInMemoryDatabase("identity"));
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
中 | [EN](README.md)

## Masa.Utils.Data.EntityFrameworkCore.InMemory

## 用例:

```c#
Install-Package Masa.Utils.Data.EntityFrameworkCore.InMemory
```

#### 用法1:

1. 配置appsettings.json

``` appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "identity"
}
}
```

2. 使用MasaDbContext

``` C#
builder.Services.AddMasaDbContext<CustomDbContext>(optionsBuilder => optionsBuilder.UseSoftDelete().UseInMemoryDatabase());
```

#### 用法2:

``` C#
builder.Services.AddMasaDbContext<CustomDbContext>(optionsBuilder => optionsBuilder.UseSoftDelete().UseInMemoryDatabase("identity"));
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
global using Microsoft.EntityFrameworkCore;
global using Microsoft.EntityFrameworkCore.Infrastructure;
global using Microsoft.Extensions.DependencyInjection;
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\Masa.Utils.Data.EntityFrameworkCore\Masa.Utils.Data.EntityFrameworkCore.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="MySql.EntityFrameworkCore" Version="6.0.0" />
</ItemGroup>

</Project>
Loading

0 comments on commit c2b6af7

Please sign in to comment.