Skip to content

Commit 1a1d9da

Browse files
v2.1.0 (#5)
* Migrate Testing.Databases.SqlServer to .NET Standard 2.0 * Reduce the dependencies to .NET 6.0 for Entity Framework and .NET 6 + .NET Framework 4.6.2 for DAC. * Add an extension method ExecuteScript() to execute a SQL script.
1 parent 2315842 commit 1a1d9da

File tree

54 files changed

+558
-327
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+558
-327
lines changed

.github/workflows/github-actions-release.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ on:
77
type: string
88
description: The version of the library
99
required: true
10-
default: 2.0.0
10+
default: 2.1.0
1111
VersionSuffix:
1212
type: string
1313
description: The version suffix of the library (for example rc.1)

Directory.Packages.props

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
<PackageVersion Include="coverlet.collector" Version="6.0.2" />
77
<PackageVersion Include="FluentAssertions" Version="6.12.1" />
88
<PackageVersion Include="Microsoft.Data.SqlClient" Version="5.0.1" />
9-
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="8.0.0" />
10-
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.0" />
11-
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.0" />
9+
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="6.0.0" />
10+
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.0" />
11+
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.0" />
1212
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
13-
<PackageVersion Include="Microsoft.SqlServer.DacFx" Version="161.6374.0" />
13+
<PackageVersion Include="Microsoft.SqlServer.DacFx" Version="162.1.172" />
1414
<PackageVersion Include="StyleCop.Analyzers" Version="1.2.0-beta.556" />
15-
<PackageVersion Include="xunit" Version="2.9.1" />
15+
<PackageVersion Include="xunit" Version="2.9.2" />
1616
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
1717
</ItemGroup>
1818
</Project>

README.md

+13-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
# PosInformatique.Testing.Databases
1+
# PosInformatique.Testing.Databases
2+
3+
[![NuGet Version](https://img.shields.io/nuget/v/PosInformatique.Testing.Databases.SqlServer?label=PosInformatique.Testing.Databases.SqlServer)](https://www.nuget.org/packages/PosInformatique.Testing.Databases.SqlServer)
4+
[![NuGet Version](https://img.shields.io/nuget/v/PosInformatique.Testing.Databases.SqlServer.Dac?label=PosInformatique.Testing.Databases.SqlServer.Dac)](https://www.nuget.org/packages/PosInformatique.Testing.Databases.SqlServer.Dac)
5+
[![NuGet Version](https://img.shields.io/nuget/v/PosInformatique.Testing.Databases.SqlServer.EntityFramework?label=PosInformatique.Testing.Databases.SqlServer.EntityFramework)](https://www.nuget.org/packages/PosInformatique.Testing.Databases.SqlServer.EntityFramework)
26

37
**PosInformatique.Testing.Databases** is a set of tools for testing databases.
48
It simplifies writing and executing tests, helping ensure your database and data access code are reliable and bug-free.
@@ -17,7 +21,7 @@ approach.
1721

1822
Since the version 2.0.0 this tools provide a comparer to compare the schema of two SQL databases.
1923

20-
## The approach of these tools
24+
## 💡 The approach of these tools
2125

2226
The main approach of these tools is to perform tests without using mocking or in-memory alternatives for ADO .NET code or Entity Framework `DbContext`, instead using a real SQL Server database.
2327

@@ -34,7 +38,7 @@ You also miss technical behaviors like transactions, connection management, trig
3438
- You perform test cases, meaning you write simple tests to validate small features instead of writing complex integration tests.
3539
- When changing the schema of the database, it is important to test and have a *safeguard* to check that the migration script (or Entity Framework migration actions) will update the database to the expected schema.
3640

37-
## How to test a persistence layer
41+
## 🧪 How to test a persistence layer
3842

3943
To perform tests of a persistence layer, the approach is straightforward using the Arrange/Act/Assert pattern:
4044

@@ -57,7 +61,7 @@ Before each test (`TestMethod` or `Fact` methods):
5761

5862
To write a test using this approach with the [PosInformatique.Testing.Databases](https://github.com/PosInformatique/PosInformatique.Testing.Databases) tools, see the [ Write tests to test the persistence layer](./docs/WriteTest.md) page.
5963

60-
## How to test database migration
64+
## 🧪 How to test database migration
6165

6266
To perform tests of a database migration, the approach is straightforward and required only a test which perform the following actions:
6367

@@ -87,7 +91,7 @@ migration code. It's better than nothing and very useful for detecting issues du
8791

8892
To write a test using this approach with the [PosInformatique.Testing.Databases](https://github.com/PosInformatique/PosInformatique.Testing.Databases) tools, see the [Write tests to test database migration](./docs/WriteDatabaseMigrationTest.md) page.
8993

90-
## What do the PosInformatique.Testing.Databases tools provide?
94+
## 📤 What do the PosInformatique.Testing.Databases tools provide?
9195

9296
Using the previous approach, the [PosInformatique.Testing.Databases](https://github.com/PosInformatique/PosInformatique.Testing.Databases) libraries allow you to:
9397

@@ -100,7 +104,7 @@ Using the previous approach, the [PosInformatique.Testing.Databases](https://git
100104

101105
- Contain a comparer tool to check schema differences between two databases.
102106

103-
## NuGet packages
107+
## 📦 NuGet packages
104108

105109
The [PosInformatique.Testing.Databases](https://github.com/PosInformatique/PosInformatique.Testing.Databases) tools are provided in two NuGet packages:
106110

@@ -115,7 +119,7 @@ The [PosInformatique.Testing.Databases](https://github.com/PosInformatique/PosIn
115119
- [PosInformatique.Testing.Databases.SqlServer.EntityFramework](https://www.nuget.org/packages/PosInformatique.Testing.Databases.SqlServer.EntityFramework) NuGet package which contains:
116120
- Tools to deploy a SQL Server database using a DbContext.
117121

118-
## Samples / Demo
122+
## 🚀 Samples / Demo
119123

120124
A complete sample solution is available in this repository inside the [samples](./samples) folder.
121125

@@ -125,7 +129,7 @@ The solution contains the following sample projects:
125129
- [DemoApp.DataAccessLayer.Tests](./samples/DemoApp.DataAccessLayer.Tests/DemoApp.DataAccessLayer.Tests.csproj): Test project to test the [DemoApp.DataAccessLayer](./samples/DemoApp.DataAccessLayer/DemoApp.DataAccessLayer.csproj)
126130
project using the [PosInformatique.Testing.Databases.SqlServer.EntityFramework](https://www.nuget.org/packages/PosInformatique.Testing.Databases.SqlServer.EntityFramework) package.
127131

128-
## Writing tests for a persistence layer
132+
## 📝 Writing tests for a persistence layer
129133

130134
To write tests for a persistence layer, follow the [Write tests to test the persistence layer](./docs/WriteTest.md) documentation page, which explains the different steps to perform
131135
using the [PosInformatique.Testing.Databases.SqlServer.EntityFramework](https://www.nuget.org/packages/PosInformatique.Testing.Databases.SqlServer.EntityFramework) library:
@@ -143,7 +147,7 @@ using the [PosInformatique.Testing.Databases.SqlServer.EntityFramework](https://
143147
- [Execute the tests](./docs/WriteTest.md#execute-the-tests)
144148
- [Check the database state after a test has failed](./docs/WriteTest.md#check-the-database-state-after-an-test-has-been-failed)
145149

146-
## Writing test to check database migration
150+
## 📝 Writing test to check database migration
147151

148152
To write an test to check the migration of database, follow the [Write tests to test database migration](./docs/WriteDatabaseMigrationTest.md)
149153
documentation page.

docs/WriteDatabaseMigrationTest.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public class DatabaseMigrationTest
8787

8888
var targetDatabase = Task.Run(() => server.CreateDatabaseAsync(TargetDatabaseName, dbContext));
8989

90-
// Wait both task
90+
// Wait both tasks
9191
await Task.WhenAll(initialDatabase, targetDatabase);
9292

9393
// Call the console application to perform migration of the "DemoApp_InitialDatabase"

docs/WriteTest.md

+35
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,41 @@ public CustomerRepositoryTest(SqlServerDatabaseInitializer initializer)
298298
Now, every time we will execute an test in the `CustomerRepositoryTest` class,
299299
a database will be deployed with these 3 `Customer` before the execution of the test.
300300

301+
### Initializes the data from a T-SQL script
302+
303+
Since the version 2.1.0, it is possible to execute a T-SQL script by using the `SqlServerDatabase.ExecuteScript()` method.
304+
305+
For example, if we want to initialize the previous customers using a T-SQL, add a `.sql` file in the project with the following code:
306+
307+
```sql
308+
INSERT INTO [Customer] ([FirstName], [LastName], [Revenue])
309+
VALUES
310+
('John', 'DOE', 110.50),
311+
('Marcel', 'DUPONT', 4852.45),
312+
('Andres', 'GARCIA', 0)
313+
```
314+
315+
In Visual Studio, set the following project properties for the `InsertData.sql` file:
316+
- `Build Action`: `Content`. This option will recompile the test project every time the T-SQL script has been changed.
317+
- `Copy to Output Directory`: `Copy if newer`. This option allows the compiler to copy the file in the output directory and
318+
make it available for the tests in the current directory when execution the tests.
319+
320+
In the constructor of the `CustomerRepositoryTest` call the script using the `SqlServerDatabase.ExecuteScript()` method.
321+
322+
```csharp
323+
public CustomerRepositoryTest(SqlServerDatabaseInitializer initializer)
324+
{
325+
using var dbContext = new DemoAppDbContext(DatabaseTestsConnectionStrings.CreateDbContextOptions<DemoAppDbContext>(DatabaseName));
326+
327+
this.database = initializer.Initialize(dbContext);
328+
329+
this.database.ExecuteScript(File.ReadAllText("InsertData.sql"));
330+
}
331+
```
332+
333+
Now, every time we will execute an test in the `CustomerRepositoryTest` class,
334+
a database will be deployed and the `InsertData.sql` will be executed.
335+
301336
## Write the tests for methods that retrieve data
302337

303338
This section describes how to write an test for methods that retrieve data (SELECT queries).

samples/DemoApp.DataAccessLayer.Tests/CustomerRepositoryTest.cs

+4
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ public CustomerRepositoryTest(SqlServerDatabaseInitializer initializer)
3535
// Also, we recommand to force to set the IDENTITY column values explicit to avoid
3636
// to update lot of code if you delete some rows later...
3737
this.database.InsertCustomer(id: 20, firstName: "Andres", lastName: "GARCIA");
38+
39+
// - Here we use a T-SQL script to insert data in the Customer table.
40+
// The script can contains GO instructions.
41+
this.database.ExecuteScript(File.ReadAllText("InsertData.sql"));
3842
}
3943

4044
[Fact]

samples/DemoApp.DataAccessLayer.Tests/DemoApp.DataAccessLayer.Tests.csproj

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<TargetFramework>net8.0</TargetFramework>
@@ -9,6 +9,16 @@
99
<IsTestProject>true</IsTestProject>
1010
</PropertyGroup>
1111

12+
<ItemGroup>
13+
<None Remove="InsertData.sql" />
14+
</ItemGroup>
15+
16+
<ItemGroup>
17+
<Content Include="InsertData.sql">
18+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
19+
</Content>
20+
</ItemGroup>
21+
1222
<ItemGroup>
1323
<PackageReference Include="coverlet.collector" />
1424
<PackageReference Include="FluentAssertions" />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
INSERT INTO [Customer] ([FirstName], [LastName], [Revenue])
2+
VALUES ('From script', 'Peter', 100)
3+
4+
GO 10 -- Execute the previous insert 10x times.

samples/Directory.Packages.props

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
<PackageVersion Include="coverlet.collector" Version="6.0.2" />
77
<PackageVersion Include="FluentAssertions" Version="6.12.1" />
88
<PackageVersion Include="Microsoft.Data.SqlClient" Version="5.0.1" />
9-
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="8.0.8" />
10-
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.8" />
11-
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.8" />
9+
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="8.0.10" />
10+
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.10" />
11+
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.10" />
1212
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
1313
<PackageVersion Include="Microsoft.SqlServer.DacFx" Version="161.6374.0" />
14-
<PackageVersion Include="PosInformatique.Testing.Databases.SqlServer.EntityFramework" Version="2.0.0-rc.1" />
14+
<PackageVersion Include="PosInformatique.Testing.Databases.SqlServer.EntityFramework" Version="2.1.0-rc.3" />
1515
<PackageVersion Include="StyleCop.Analyzers" Version="1.2.0-beta.556" />
16-
<PackageVersion Include="xunit" Version="2.9.1" />
16+
<PackageVersion Include="xunit" Version="2.9.2" />
1717
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
1818
</ItemGroup>
1919
</Project>

src/Directory.Build.props

+19-5
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,25 @@
1111
<PackageReadmeFile>README.md</PackageReadmeFile>
1212
<PackageLicenseExpression>MIT</PackageLicenseExpression>
1313
<PackageReleaseNotes>
14-
1.0.1
15-
- Fix the documentation
16-
17-
1.0.0
18-
- Initial version
14+
2.1.0
15+
- PosInformatique.Testing.Databases.SqlServer target the .NET Standard 2.0 platform.
16+
- PosInformatique.Testing.Databases.SqlServer.Dac target the .NET Core 6.0 and .NET Framework 4.6.2
17+
- PosInformatique.Testing.Databases.SqlServer.EntityFramework target the .NET Core 6.0
18+
- Reduce the dependencies to Entity Framework 6.0
19+
- Reduce the dependencies of DACfx to a more earlier version.
20+
- Add new method SqlServerDatabase.ExecuteScript() to execute T-SQL scripts.
21+
22+
2.0.0
23+
- Add SqlServerDatabaseComparer class to perform comparison between two databases.
24+
- Add new PosInformatique.Testing.Databases.SqlServer.Dac NuGet package which contains DAC package tools.
25+
- Add new SqlServer.CreateDatabaseAsync() extension method to create a database from a DbContext.
26+
- Reduce dependencies version of the Entity Framework Core and SQL Server Client NuGet packages.
27+
28+
1.0.1
29+
- Fix the documentation
30+
31+
1.0.0
32+
- Initial version
1933
</PackageReleaseNotes>
2034
</PropertyGroup>
2135

src/Testing.Databases.SqlServer.Dac/Testing.Databases.SqlServer.Dac.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net8.0</TargetFramework>
4+
<TargetFrameworks>net6.0;net462</TargetFrameworks>
55

66
<Description>Testing.Databases.SqlServer.Dac is a library that contains a set of tools for testing to deploy DAC (Data-tier Applications) packages (.dacpac files).</Description>
77
<PackageTags>testing unittest sqlserver repository tdd dataaccesslayer dacpac dac</PackageTags>

src/Testing.Databases.SqlServer.EntityFramework/Testing.Databases.SqlServer.EntityFramework.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net8.0</TargetFramework>
4+
<TargetFramework>net6.0</TargetFramework>
55
<GenerateDocumentationFile>True</GenerateDocumentationFile>
66

77
<Description>Testing.Databases.SqlServer.EntityFramework is a library that contains a set of tools for testing Data Access Layer (repositories) based on Entity Framework and SQL Server.</Description>

src/Testing.Databases.SqlServer/Comparer/SqlDatabaseComparisonResults.cs

+13-5
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,37 @@ namespace PosInformatique.Testing.Databases
1313
/// </summary>
1414
public class SqlDatabaseComparisonResults
1515
{
16-
internal SqlDatabaseComparisonResults()
16+
internal SqlDatabaseComparisonResults(
17+
IList<SqlObjectDifferences<SqlStoredProcedure>> storedProcedures,
18+
IList<SqlTableDifferences> tables,
19+
IList<SqlObjectDifferences<SqlUserType>> userTypes,
20+
IList<SqlObjectDifferences<SqlView>> views)
1721
{
22+
this.StoredProcedures = new ReadOnlyCollection<SqlObjectDifferences<SqlStoredProcedure>>(storedProcedures);
23+
this.Tables = new ReadOnlyCollection<SqlTableDifferences>(tables);
24+
this.UserTypes = new ReadOnlyCollection<SqlObjectDifferences<SqlUserType>>(userTypes);
25+
this.Views = new ReadOnlyCollection<SqlObjectDifferences<SqlView>>(views);
1826
}
1927

2028
/// <summary>
2129
/// Gets the stored procedures which are different between two databases.
2230
/// </summary>
23-
public required ReadOnlyCollection<SqlObjectDifferences<SqlStoredProcedure>> StoredProcedures { get; init; }
31+
public ReadOnlyCollection<SqlObjectDifferences<SqlStoredProcedure>> StoredProcedures { get; }
2432

2533
/// <summary>
2634
/// Gets the tables which are different between two databases.
2735
/// </summary>
28-
public required ReadOnlyCollection<SqlTableDifferences> Tables { get; init; }
36+
public ReadOnlyCollection<SqlTableDifferences> Tables { get; }
2937

3038
/// <summary>
3139
/// Gets the user types which are different between two databases.
3240
/// </summary>
33-
public required ReadOnlyCollection<SqlObjectDifferences<SqlUserType>> UserTypes { get; init; }
41+
public ReadOnlyCollection<SqlObjectDifferences<SqlUserType>> UserTypes { get; }
3442

3543
/// <summary>
3644
/// Gets the views which are different between two databases.
3745
/// </summary>
38-
public required ReadOnlyCollection<SqlObjectDifferences<SqlView>> Views { get; init; }
46+
public ReadOnlyCollection<SqlObjectDifferences<SqlView>> Views { get; }
3947

4048
/// <summary>
4149
/// Gets a value indicating whether if the two database compared have the same schema.

src/Testing.Databases.SqlServer/Comparer/SqlDatabaseComparisonResultsTextGenerator.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ private void WriteLine()
219219

220220
private void WriteLine(string value)
221221
{
222-
var lines = value.Split(Environment.NewLine);
222+
var lines = value.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
223223

224224
if (lines.Length > 1)
225225
{

src/Testing.Databases.SqlServer/Comparer/SqlObjectDifferences{TSqlObject}.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ internal SqlObjectDifferences(TSqlObject? source, TSqlObject? target, SqlObjectD
4949
/// <summary>
5050
/// Gets the property changes between <see cref="Source"/> and <see cref="Target"/>.
5151
/// </summary>
52-
public ReadOnlyCollection<SqlObjectPropertyDifference> Properties { get; init; }
52+
public ReadOnlyCollection<SqlObjectPropertyDifference> Properties { get; }
5353

5454
/// <summary>
5555
/// Returns a textual representation of the result comparison.

src/Testing.Databases.SqlServer/Comparer/SqlServerDatabaseComparer.cs

+1-7
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,7 @@ await Task.WhenAll(
6262
var userTypesDifferences = SqlObjectComparer.Compare(sourceUserTypes.Result, targetUserTypes.Result, ut => ut.Name);
6363
var viewsDifferences = SqlObjectComparer.Compare(sourceViews.Result, targetViews.Result, v => v.Schema + "." + v.Name);
6464

65-
return new SqlDatabaseComparisonResults()
66-
{
67-
StoredProcedures = new ReadOnlyCollection<SqlObjectDifferences<SqlStoredProcedure>>(storedProceduresDifferences),
68-
Tables = new ReadOnlyCollection<SqlTableDifferences>(tablesDifferences),
69-
UserTypes = new ReadOnlyCollection<SqlObjectDifferences<SqlUserType>>(userTypesDifferences),
70-
Views = new ReadOnlyCollection<SqlObjectDifferences<SqlView>>(viewsDifferences),
71-
};
65+
return new SqlDatabaseComparisonResults(storedProceduresDifferences, tablesDifferences, userTypesDifferences, viewsDifferences);
7266
}
7367
}
7468
}

src/Testing.Databases.SqlServer/Comparer/SqlTableDifferences.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ internal SqlTableDifferences(
5858
/// <summary>
5959
/// Gets the primary key differences between the two SQL tables.
6060
/// </summary>
61-
public required SqlPrimaryKeyDifferences? PrimaryKey { get; init; }
61+
public SqlPrimaryKeyDifferences? PrimaryKey { get; internal set; }
6262

6363
/// <summary>
6464
/// Gets the foreign keys differences between the two SQL tables.

src/Testing.Databases.SqlServer/Comparer/TsqlCodeHelper.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ internal static class TsqlCodeHelper
1616
}
1717

1818
return code
19-
.ReplaceLineEndings(string.Empty)
19+
.Replace(Environment.NewLine, string.Empty)
2020
.Replace(" ", string.Empty)
2121
.Replace("\t", string.Empty);
2222
}

src/Testing.Databases.SqlServer/ObjectModel/SqlCheckConstraint.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,21 @@ namespace PosInformatique.Testing.Databases
1111
/// </summary>
1212
public sealed class SqlCheckConstraint : SqlObject
1313
{
14-
internal SqlCheckConstraint()
14+
internal SqlCheckConstraint(string name, string code)
1515
{
16+
this.Name = name;
17+
this.Code = code;
1618
}
1719

1820
/// <summary>
1921
/// Gets the name of the check constraint type.
2022
/// </summary>
21-
public required string Name { get; init; }
23+
public string Name { get; }
2224

2325
/// <summary>
2426
/// Gets the code of the check constraint.
2527
/// </summary>
26-
public required string Code { get; init; }
28+
public string Code { get; }
2729

2830
/// <inheritdoc />
2931
public override TResult Accept<TResult>(ISqlObjectVisitor<TResult> visitor) => visitor.Visit(this);

0 commit comments

Comments
 (0)