Skip to content

Commit d4f832d

Browse files
committed
Further cleanup tweaks.
1 parent a8e33dc commit d4f832d

File tree

44 files changed

+122
-120
lines changed

Some content is hidden

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

44 files changed

+122
-120
lines changed

Diff for: docs/Sample-EntityFramework-GettingStarted.md

+4-3
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@ It is recommended that the following is installed to simplify the opening of a c
1919

2020
The [`Beef.Template.Solution`](../templates/Beef.Template.Solution/README.md) needs to be installed so that it can be used to easily create the required [solution structure](./Solution-Structure.md).
2121

22-
Install (or update) the latest template from the public [NuGet](https://www.nuget.org/packages/Beef.Template.Solution/) repository using the `dotnet new -i` command as follows:
22+
Install (or update) the latest template from the public [NuGet](https://www.nuget.org/packages/Beef.Template.Solution/) repository using the [`dotnet new -i`](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-new-install) command as follows (or alternatively specify the required version):
2323

2424
```
2525
dotnet new -i beef.template.solution --nuget-source https://api.nuget.org/v3/index.json
26+
27+
dotnet new -i beef.template.solution::5.1.preview1 --nuget-source https://api.nuget.org/v3/index.json
2628
```
2729

2830
<br/>
@@ -83,10 +85,9 @@ Generate the configured tables and C# models:
8385
```
8486
cd Foo.Bar.Database
8587
dotnet run all
86-
dotnet run codegen --script DatabaseEventOutbox.xml
8788
```
8889

89-
This will build and run the `Foo.Bar.Database` console; the outcome of the code generation and database setup/configuration will be logged to the console showing what was added or updated. The final command will create the required migration scripts for the event outbox functionality.
90+
This will build and run the `Foo.Bar.Database` console; the outcome of the code generation and database setup/configuration will be logged to the console showing what was added or updated.
9091

9192
<br/>
9293

Diff for: samples/Cdr.Banking/Cdr.Banking.Business/Cdr.Banking.Business.csproj

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
<Folder Include="DataSvc\" />
1212
</ItemGroup>
1313
<ItemGroup>
14-
<PackageReference Include="CoreEx.AutoMapper" Version="1.0.10" />
15-
<PackageReference Include="CoreEx.Cosmos" Version="1.0.10" />
16-
<PackageReference Include="CoreEx.Validation" Version="1.0.10" />
14+
<PackageReference Include="CoreEx.AutoMapper" Version="1.0.11" />
15+
<PackageReference Include="CoreEx.Cosmos" Version="1.0.11" />
16+
<PackageReference Include="CoreEx.Validation" Version="1.0.11" />
1717
</ItemGroup>
1818
</Project>

Diff for: samples/Cdr.Banking/Cdr.Banking.Common/Cdr.Banking.Common.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88
<Folder Include="Entities\" />
99
</ItemGroup>
1010
<ItemGroup>
11-
<PackageReference Include="CoreEx" Version="1.0.10" />
11+
<PackageReference Include="CoreEx" Version="1.0.11" />
1212
</ItemGroup>
1313
</Project>

Diff for: samples/Demo/Beef.Demo.Business/Beef.Demo.Business.csproj

+6-6
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
</ItemGroup>
1616

1717
<ItemGroup>
18-
<PackageReference Include="CoreEx" Version="1.0.10" />
19-
<PackageReference Include="CoreEx.AutoMapper" Version="1.0.10" />
20-
<PackageReference Include="CoreEx.Cosmos" Version="1.0.10" />
21-
<PackageReference Include="CoreEx.Database" Version="1.0.10" />
22-
<PackageReference Include="CoreEx.EntityFrameworkCore" Version="1.0.10" />
23-
<PackageReference Include="CoreEx.Validation" Version="1.0.10" />
18+
<PackageReference Include="CoreEx" Version="1.0.11" />
19+
<PackageReference Include="CoreEx.AutoMapper" Version="1.0.11" />
20+
<PackageReference Include="CoreEx.Cosmos" Version="1.0.11" />
21+
<PackageReference Include="CoreEx.Database" Version="1.0.11" />
22+
<PackageReference Include="CoreEx.EntityFrameworkCore" Version="1.0.11" />
23+
<PackageReference Include="CoreEx.Validation" Version="1.0.11" />
2424
</ItemGroup>
2525

2626
<ItemGroup>

Diff for: samples/Demo/Beef.Demo.Common/Beef.Demo.Common.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<Folder Include="Entities\" />
99
</ItemGroup>
1010
<ItemGroup>
11-
<PackageReference Include="CoreEx" Version="1.0.10" />
11+
<PackageReference Include="CoreEx" Version="1.0.11" />
1212
<PackageReference Include="Grpc.Tools" Version="2.45.0">
1313
<PrivateAssets>all</PrivateAssets>
1414
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

Diff for: samples/Demo/Beef.Demo.Database/Migrations/20221101-162158-03-create-outbox-eventoutboxdata-table.sql renamed to samples/Demo/Beef.Demo.Database/Migrations/20221107-223507-03-create-outbox-eventoutboxdata-table.sql

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ CREATE TABLE [Outbox].[EventOutboxData] (
1212
[Source] NVARCHAR(1023) NULL,
1313
[Timestamp] DATETIMEOFFSET,
1414
[CorrelationId] NVARCHAR(127),
15+
[Key] NVARCHAR(1023) NULL,
1516
[TenantId] NVARCHAR(127),
1617
[PartitionKey] NVARCHAR(127),
1718
[ETag] NVARCHAR(127),

Diff for: samples/Demo/Beef.Demo.Database/Schema/Outbox/Stored Procedures/Generated/spEventOutboxDequeue.sql

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ BEGIN
4242
[Source],
4343
[Timestamp],
4444
[CorrelationId],
45+
[Key],
4546
[TenantId],
4647
[PartitionKey],
4748
[ETag],

Diff for: samples/Demo/Beef.Demo.Database/Schema/Outbox/Stored Procedures/Generated/spEventOutboxEnqueue.sql

+6-3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ BEGIN
3434
@source NVARCHAR(1023),
3535
@timestamp DATETIMEOFFSET,
3636
@correlationId NVARCHAR(127),
37+
@key NVARCHAR(1023),
3738
@tenantId NVARCHAR(127),
3839
@partitionKey NVARCHAR(127),
3940
@etag NVARCHAR(127),
@@ -42,10 +43,10 @@ BEGIN
4243

4344
-- Declare, open, and fetch first event from cursor.
4445
DECLARE c CURSOR FORWARD_ONLY
45-
FOR SELECT [EventId], [EventDequeued], [Destination], [Subject], [Action], [Type], [Source], [Timestamp], [CorrelationId], [TenantId], [PartitionKey], [ETag], [Attributes], [Data] FROM @EventList
46+
FOR SELECT [EventId], [EventDequeued], [Destination], [Subject], [Action], [Type], [Source], [Timestamp], [CorrelationId], [Key], [TenantId], [PartitionKey], [ETag], [Attributes], [Data] FROM @EventList
4647

4748
OPEN c
48-
FETCH NEXT FROM c INTO @eventId, @eventDequeued, @destination, @subject, @action, @type, @source, @timestamp, @correlationId, @tenantId, @partitionKey, @etag, @attributes, @data
49+
FETCH NEXT FROM c INTO @eventId, @eventDequeued, @destination, @subject, @action, @type, @source, @timestamp, @correlationId, @key, @tenantId, @partitionKey, @etag, @attributes, @data
4950

5051
-- Iterate the event(s).
5152
WHILE @@FETCH_STATUS = 0
@@ -68,6 +69,7 @@ BEGIN
6869
[Source],
6970
[Timestamp],
7071
[CorrelationId],
72+
[Key],
7173
[TenantId],
7274
[PartitionKey],
7375
[ETag],
@@ -84,6 +86,7 @@ BEGIN
8486
@source,
8587
@timestamp,
8688
@correlationId,
89+
@key,
8790
@tenantId,
8891
@partitionKey,
8992
@etag,
@@ -92,7 +95,7 @@ BEGIN
9295
)
9396

9497
-- Fetch the next event from the cursor.
95-
FETCH NEXT FROM c INTO @eventId, @eventDequeued, @destination, @subject, @action, @type, @source, @timestamp, @correlationId, @tenantId, @partitionKey, @etag, @attributes, @data
98+
FETCH NEXT FROM c INTO @eventId, @eventDequeued, @destination, @subject, @action, @type, @source, @timestamp, @correlationId, @key, @tenantId, @partitionKey, @etag, @attributes, @data
9699
END
97100

98101
-- Close the cursor.

Diff for: samples/Demo/Beef.Demo.Database/Schema/Outbox/Types/User-Defined Table Types/Generated/udtEventOutboxList.sql

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ CREATE TYPE [Outbox].[udtEventOutboxList] AS TABLE (
1212
[Source] NVARCHAR(1023) NULL,
1313
[Timestamp] DATETIMEOFFSET,
1414
[CorrelationId] NVARCHAR(127),
15+
[Key] NVARCHAR(1023) NULL,
1516
[TenantId] NVARCHAR(127),
1617
[PartitionKey] NVARCHAR(127),
1718
[ETag] NVARCHAR(127),

Diff for: samples/My.Hr/My.Hr.Business/My.Hr.Business.csproj

+5-5
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
<ImplicitUsings>true</ImplicitUsings>
66
</PropertyGroup>
77
<ItemGroup>
8-
<PackageReference Include="CoreEx" Version="1.0.10" />
9-
<PackageReference Include="CoreEx.AutoMapper" Version="1.0.10" />
10-
<PackageReference Include="CoreEx.Database" Version="1.0.10" />
11-
<PackageReference Include="CoreEx.EntityFrameworkCore" Version="1.0.10" />
12-
<PackageReference Include="CoreEx.Validation" Version="1.0.10" />
8+
<PackageReference Include="CoreEx" Version="1.0.11" />
9+
<PackageReference Include="CoreEx.AutoMapper" Version="1.0.11" />
10+
<PackageReference Include="CoreEx.Database" Version="1.0.11" />
11+
<PackageReference Include="CoreEx.EntityFrameworkCore" Version="1.0.11" />
12+
<PackageReference Include="CoreEx.Validation" Version="1.0.11" />
1313
</ItemGroup>
1414
</Project>

Diff for: samples/My.Hr/My.Hr.Common/My.Hr.Common.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44
<Nullable>enable</Nullable>
55
</PropertyGroup>
66
<ItemGroup>
7-
<PackageReference Include="CoreEx" Version="1.0.10" />
7+
<PackageReference Include="CoreEx" Version="1.0.11" />
88
</ItemGroup>
99
</Project>

Diff for: samples/My.Hr/My.Hr.Database/Program.cs

+10-11
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
using Beef.Database.Core;
22
using System.Threading.Tasks;
33

4-
namespace My.Hr.Database
4+
namespace My.Hr.Database;
5+
6+
/// <summary>
7+
/// Represents the <b>database utilities</b> program (capability).
8+
/// </summary>
9+
public static class Program
510
{
611
/// <summary>
7-
/// Represents the <b>database utilities</b> program (capability).
12+
/// Main startup.
813
/// </summary>
9-
public static class Program
10-
{
11-
/// <summary>
12-
/// Main startup.
13-
/// </summary>
14-
/// <param name="args">The startup arguments.</param>
15-
/// <returns>The status code whereby zero indicates success.</returns>
16-
static Task<int> Main(string[] args) => DatabaseConsole.Create("Data Source =.; Initial Catalog = My.Hr; Integrated Security = True; TrustServerCertificate = true", "My", "Hr", useBeefDbo: true).RunAsync(args);
17-
}
14+
/// <param name="args">The startup arguments.</param>
15+
/// <returns>The status code whereby zero indicates success.</returns>
16+
static Task<int> Main(string[] args) => DatabaseConsole.Create("Data Source =.; Initial Catalog = My.Hr; Integrated Security = True; TrustServerCertificate = true", "My", "Hr", useBeefDbo: true).RunAsync(args);
1817
}

Diff for: samples/My.Hr/My.Hr.Test/My.Hr.Test.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
</ItemGroup>
3333

3434
<ItemGroup>
35-
<PackageReference Include="CoreEx" Version="1.0.10" />
35+
<PackageReference Include="CoreEx" Version="1.0.11" />
3636
<PackageReference Include="NUnit3TestAdapter" Version="4.0.0">
3737
<PrivateAssets>all</PrivateAssets>
3838
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

Diff for: samples/My.Hr/README.md

+13-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ This sample will walkthrough an approach of adding the capabilities in a series
88

99
</br>
1010

11+
## Beef primer
12+
13+
_Beef_ is obstensibly the code-generation engine that ultimately takes dependencies on the following capabilities to enable the end-to-functionality and testing thereof:
14+
- [CoreEx](https://github.com/Avanade/CoreEx) - provides the core runtime capabilties (extends .NET core);
15+
- [DbEx](https://github.com/Avanade/DbEx) - provides extended database management capabilties;
16+
- [OnRamp](https://github.com/Avanade/OnRamp) - provides the underlying code-generation engine functionality; and,
17+
- [UnitTestEx](https://github.com/Avanade/UnitTestEx) - provides extended unit and intra-domain integration testing.
18+
19+
</br>
20+
1121
## Scope
1222

1323
Within the sample there will two primary entities exposed:
@@ -102,4 +112,6 @@ The basis of the functional capabilities have been created for our fictitious so
102112

103113
The developer should have witnessed that reasonably complicated logic can be built using this _config_ to _code-gen_ to _custom_ approach. Where the _custom_ effort is for the most part focused on the key business value delivery; not the related boilerplate. Plus, with the testing framework, how complex end-to-end intra-domain integration tests can be created to appropriately validate the underlying logic - which can easily be integrated into the developer build-test-release lifecycle.
104114

105-
It is acknowledged that there is a learning curve required for using _Beef_; and in time greater acceleration will be achieved as experience is gained. Please review the extended documentation and provide feedback, questions, defects, etc. via a [issue](https://github.com/Avanade/Beef/issues). Thanks and enjoy :-)
115+
It is acknowledged that there is a learning curve required for using _Beef_; and in time greater acceleration will be achieved as experience is gained. Please review the extended documentation and provide feedback, questions, defects, etc. via an [issue](https://github.com/Avanade/Beef/issues).
116+
117+
Thanks and enjoy :-)

Diff for: samples/My.Hr/docs/Employee-DB.md

+18-12
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,23 @@
22

33
This will walk through the process of creating the required tables, and stored procedures, etc. needed for the `Employee` within a Microsoft SQL Server database. All of this work will occur within the context of the `My.Hr.Database` project.
44

5-
The [`Beef.Database.Core`](../../../tools/Beef.Database.Core/README.md) provides the capabilities that will be leveraged. The underlying documentation describes these capabuilities and the database approach in greater detail.
5+
The [`Beef.Database.Core`](../../../tools/Beef.Database.Core/README.md) provides the capabilities that will be leveraged. The underlying documentation describes these capabilities and the database approach in greater detail.
66

77
_Note:_ Any time that command line execution is requested, this should be performed from the base `My.Hr.Database` folder.
88

99
<br/>
1010

1111
## Entity relationship diagram
1212

13-
The following provides a visual (ERD) for the database tables that will be created. A relationship label of _refers_ indicates a reference data relationship. The _(via JSON)_ implies that the relating table references invisibly to the database via a JSON data column.
13+
The following provides a visual (ERD) for the database tables that will be created. A relationship label of _refers_ indicates a reference data relationship. The _(via JSON)_ implies that the relating entity references via a JSON data column (_not_ a referenced database table).
1414

1515
``` mermaid
1616
erDiagram
1717
Employee ||--o{ EmergencyContact : has
1818
Employee }|..|{ Gender : refers
1919
Employee }|..|{ TerminationReason : refers
20-
Employee }|..|{ USState : "refers (via JSON)"
20+
Employee }|..|{ USState : refers
21+
Employee ||--o{ Address : has (via JSON)
2122
EmergencyContact }|..|{ RelationshipType : refers
2223
```
2324

@@ -136,7 +137,7 @@ dotnet run script refdata Hr USState
136137

137138
Now that the Reference Data tables exist they will need to be populated. It is recommended that where possible that the Production environment values are specified (as these are intended to be deployed to all environments).
138139

139-
These values (database rows) are specified using YAML. For brevity in this document, copy the data for the above tables **only** (for now) from [`RefData.yaml`](../My.Hr.Database/Data/RefData.yaml) replacing the contents of the prefilled `RefData.yaml` within the `My.Hr.Database/Data` folder.
140+
These values (database rows) are specified using YAML. For brevity in this document, copy the data for the above tables **only** (for now) from [`RefData.yaml`](../My.Hr.Database/Data/RefData.yaml) replacing the contents of the prefilled `RefData.yaml` within the `My.Hr.Database/Data` folder. Finally, remove the `PerformanceOutcome` lines at the end of the file.
140141

141142
_Note:_ The format and hierarchy for the YAML, is: Schema, Table, Row. For reference data tables where only `Code: Text` is provided, this is treated as a special case shorthand to update those two columns accordingly (the other columns will be updated automatically). The `$` prefix for a table indicates a `merge` versus an `insert` (default).
142143

@@ -160,12 +161,8 @@ Remove all existing configuration from `database.beef.yaml` and replace. Each ta
160161
``` yaml
161162
# Configuring the code-generation global settings
162163
# - Schema defines the default for al tables unless explicitly defined.
163-
# - EventOutbox indicates whether events will publish using the outbox pattern and therefore the event outbox artefacts are required.
164-
# - EntityScope of Autonomous will generate both business and common entities to allow each to be used autonomously; versus using shared common.
165164
#
166165
schema: Hr
167-
eventOutbox: true
168-
entityScope: Autonomous
169166
tables:
170167
# Reference data tables/models.
171168
- { name: Gender, efModel: true }
@@ -278,18 +275,27 @@ Where tables need indexes and other constraints added these would be created usi
278275
279276
## Event outbox
280277
281-
To support the [transactional outbox pattern](https://microservices.io/patterns/data/transactional-outbox.html) there is the need to have the backing event queue tables. The migration scripts to create these can be code generated using the following.
278+
To support the [transactional outbox pattern](https://microservices.io/patterns/data/transactional-outbox.html) there is the need to have backing event queue tables. The migration scripts to create these can be code generated by adding the following to the top of the `database.beef-5.yaml` file directly under the `schema: hr` line.
279+
280+
``` yaml
281+
outbox: true
282+
outboxSchemaCreate: true
283+
```
284+
285+
Execute the code-generation again using `codegen` option to generate the newly configured migration scripts. Once generated the database can be updated to use by using the `database` option. Run both of the following commands.
282286

283287
```
284-
dotnet run codegen --script DatabaseEventOutbox
288+
dotnet run codegen
289+
dotnet run database
285290
```
286291

287292
This should create two migrations script files with names similar as follows.
288293

289294
```
290295
└── Migrations
291-
└── 20210430-170605-create-hr-eventoutbox-table.sql
292-
└── 20210430-170605-create-hr-eventoutboxdata-table.sql
296+
└── 20210430-170605-create-01-create-outbox-schema.sql
297+
└── 20210430-170605-create-01-create-outbox-eventoutbox-table.sql
298+
└── 20210430-170605-create-01-create-outbox-eventoutboxdata-table.sql
293299
```
294300

295301

Diff for: templates/Beef.Template.Solution/content/.template.config/template.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
"coreex_version": {
6161
"type": "parameter",
6262
"replaces": "CoreExVersion",
63-
"defaultValue": "1.0.10",
63+
"defaultValue": "1.0.11",
6464
"datatype": "text",
6565
"description": "The CoreEx packages version."
6666
},

Diff for: templates/Beef.Template.Solution/content/Company.AppName.Business/Data/AppNameEfDbContext.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Foo.Ef.Bar.Business.Data.EfModel;
1+
using Company.AppName.Business.Data.EfModel;
22

33
namespace Company.AppName.Business.Data;
44

Diff for: templates/Beef.Template.Solution/content/Company.AppName.CodeGen/entity.beef-5.yaml

+4-4
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ entities:
4646
# The following is an example Entity with CRUD operations defined accessing a SQL Database using EntityFramework.
4747
- { name: Person, text: Person, collection: true, collectionResult: true, validator: PersonValidator, webApiRoutePrefix: persons, get: true, create: true, update: true, patch: true, delete: true, autoImplement: EntityFramework, entityFrameworkModel: EfModel.Person,
4848
properties: [
49-
{ name: Id, text: '{{Person}} identifier', type: Guid, primaryKey: true, identifierGenerator: IGuidIdentifierGenerator, dataName: PersonId },
49+
{ name: Id, text: '{{Person}} identifier', type: Guid, primaryKey: true, dataName: PersonId },
5050
{ name: FirstName },
5151
{ name: LastName },
5252
{ name: Gender, type: ^Gender, dataName: GenderCode },
@@ -83,7 +83,7 @@ entities:
8383

8484
- { name: Person, text: Person, collection: true, collectionResult: true, validator: PersonValidator, webApiRoutePrefix: persons, get: true, create: true, update: true, patch: true, delete: true, dataModel: true, autoImplement: Cosmos, cosmosContainerId: Person, cosmosModel: Model.Person,
8585
properties: [
86-
{ name: Id, text: '{{Person}} identifier', type: Guid, primaryKey: true, identifierGenerator: IGuidIdentifierGenerator },
86+
{ name: Id, text: '{{Person}} identifier', type: Guid, primaryKey: true },
8787
{ name: FirstName },
8888
{ name: LastName },
8989
{ name: Gender, type: ^Gender },
@@ -120,7 +120,7 @@ entities:
120120
# The following is an example Entity with CRUD operations defined accessing a SQL Database using Stored Procedures.
121121
- { name: Person, text: Person, collection: true, collectionResult: true, validator: PersonValidator, webApiRoutePrefix: persons, get: true, create: true, update: true, patch: true, delete: true, dataModel: true, autoImplement: HttpAgent, httpAgentModel: Model.Person, httpAgentRoutePrefix: People,
122122
properties: [
123-
{ name: Id, text: '{{Person}} identifier', type: Guid, primaryKey: true, identifierGenerator: IGuidIdentifierGenerator },
123+
{ name: Id, text: '{{Person}} identifier', type: Guid, primaryKey: true },
124124
{ name: FirstName },
125125
{ name: LastName },
126126
{ name: Gender, type: ^Gender },
@@ -141,7 +141,7 @@ entities:
141141
# The following is an example Entity with CRUD operations defined accessing a SQL Database using Stored Procedures.
142142
- { name: Person, text: Person, collection: true, collectionResult: true, validator: PersonValidator, webApiRoutePrefix: persons, get: true, create: true, update: true, patch: true, delete: true,
143143
properties: [
144-
{ name: Id, text: '{{Person}} identifier', type: Guid, primaryKey: true, identifierGenerator: IGuidIdentifierGenerator },
144+
{ name: Id, text: '{{Person}} identifier', type: Guid, primaryKey: true },
145145
{ name: FirstName },
146146
{ name: LastName },
147147
{ name: Gender, type: ^Gender },

0 commit comments

Comments
 (0)