Skip to content

Commit ab8759c

Browse files
committed
1 parent f0b6a2d commit ab8759c

File tree

6 files changed

+96
-24
lines changed

6 files changed

+96
-24
lines changed

test/JsonApiDotNetCoreTests/IntegrationTests/ResourceInheritance/ResourceInheritanceWriteTests.cs

+12-4
Original file line numberDiff line numberDiff line change
@@ -2298,7 +2298,7 @@ public async Task Can_add_concrete_base_resources_stored_as_derived_at_ToMany_re
22982298

22992299
await _testContext.RunOnDatabaseAsync(async dbContext =>
23002300
{
2301-
dbContext.Set<VehicleManufacturer>().Add(existingManufacturer);
2301+
dbContext.VehicleManufacturers.Add(existingManufacturer);
23022302
dbContext.Vehicles.Add(existingTandem);
23032303
await dbContext.SaveChangesAsync();
23042304
});
@@ -2327,9 +2327,17 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
23272327

23282328
await _testContext.RunOnDatabaseAsync(async dbContext =>
23292329
{
2330-
VehicleManufacturer manufacturerInDatabase = await dbContext.Set<VehicleManufacturer>().Include(manufacturer => manufacturer.Vehicles)
2330+
// @formatter:wrap_chained_method_calls chop_always
2331+
// @formatter:keep_existing_linebreaks true
2332+
2333+
VehicleManufacturer manufacturerInDatabase = await dbContext.VehicleManufacturers
2334+
.Include(manufacturer => manufacturer.Vehicles
2335+
.OrderByDescending(vehicle => vehicle.Id))
23312336
.FirstWithIdAsync(existingManufacturer.Id);
23322337

2338+
// @formatter:keep_existing_linebreaks restore
2339+
// @formatter:wrap_chained_method_calls restore
2340+
23332341
manufacturerInDatabase.Vehicles.ShouldHaveCount(2);
23342342
manufacturerInDatabase.Vehicles.ElementAt(0).Should().BeOfType<Car>();
23352343
manufacturerInDatabase.Vehicles.ElementAt(0).Id.Should().Be(existingManufacturer.Vehicles.ElementAt(0).Id);
@@ -2578,7 +2586,7 @@ public async Task Can_remove_concrete_base_resources_stored_as_derived_at_ToMany
25782586

25792587
await _testContext.RunOnDatabaseAsync(async dbContext =>
25802588
{
2581-
dbContext.Set<VehicleManufacturer>().Add(existingManufacturer);
2589+
dbContext.VehicleManufacturers.Add(existingManufacturer);
25822590
await dbContext.SaveChangesAsync();
25832591
});
25842592

@@ -2606,7 +2614,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
26062614

26072615
await _testContext.RunOnDatabaseAsync(async dbContext =>
26082616
{
2609-
VehicleManufacturer manufacturerInDatabase = await dbContext.Set<VehicleManufacturer>().Include(manufacturer => manufacturer.Vehicles)
2617+
VehicleManufacturer manufacturerInDatabase = await dbContext.VehicleManufacturers.Include(manufacturer => manufacturer.Vehicles)
26102618
.FirstWithIdAsync(existingManufacturer.Id);
26112619

26122620
manufacturerInDatabase.Vehicles.ShouldHaveCount(1);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using JetBrains.Annotations;
2+
using JsonApiDotNetCoreTests.IntegrationTests.ResourceInheritance.Models;
3+
using Microsoft.EntityFrameworkCore;
4+
5+
// @formatter:wrap_chained_method_calls chop_always
6+
7+
namespace JsonApiDotNetCoreTests.IntegrationTests.ResourceInheritance.TablePerConcreteType;
8+
9+
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
10+
public sealed class TablePerConcreteTypeDbContext : ResourceInheritanceDbContext
11+
{
12+
public TablePerConcreteTypeDbContext(DbContextOptions<TablePerConcreteTypeDbContext> options)
13+
: base(options)
14+
{
15+
}
16+
17+
protected override void OnModelCreating(ModelBuilder builder)
18+
{
19+
builder.Entity<Vehicle>()
20+
.UseTpcMappingStrategy();
21+
22+
builder.Entity<Wheel>()
23+
.UseTpcMappingStrategy();
24+
25+
builder.Entity<Engine>()
26+
.UseTpcMappingStrategy();
27+
28+
builder.Entity<GenericProperty>()
29+
.UseTpcMappingStrategy();
30+
31+
base.OnModelCreating(builder);
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using JetBrains.Annotations;
2+
using TestBuildingBlocks;
3+
4+
namespace JsonApiDotNetCoreTests.IntegrationTests.ResourceInheritance.TablePerConcreteType;
5+
6+
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
7+
public sealed class TablePerConcreteTypeReadTests : ResourceInheritanceReadTests<TablePerConcreteTypeDbContext>
8+
{
9+
public TablePerConcreteTypeReadTests(IntegrationTestContext<TestableStartup<TablePerConcreteTypeDbContext>, TablePerConcreteTypeDbContext> testContext)
10+
: base(testContext)
11+
{
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using JetBrains.Annotations;
2+
using TestBuildingBlocks;
3+
4+
namespace JsonApiDotNetCoreTests.IntegrationTests.ResourceInheritance.TablePerConcreteType;
5+
6+
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
7+
public sealed class TablePerConcreteTypeWriteTests : ResourceInheritanceWriteTests<TablePerConcreteTypeDbContext>
8+
{
9+
public TablePerConcreteTypeWriteTests(IntegrationTestContext<TestableStartup<TablePerConcreteTypeDbContext>, TablePerConcreteTypeDbContext> testContext)
10+
: base(testContext)
11+
{
12+
}
13+
}

test/JsonApiDotNetCoreTests/IntegrationTests/ResourceInheritance/TablePerType/TablePerTypeDbContext.cs

+13-18
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using JsonApiDotNetCoreTests.IntegrationTests.ResourceInheritance.Models;
33
using Microsoft.EntityFrameworkCore;
44

5+
// @formatter:wrap_chained_method_calls chop_always
6+
57
namespace JsonApiDotNetCoreTests.IntegrationTests.ResourceInheritance.TablePerType;
68

79
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
@@ -14,24 +16,17 @@ public TablePerTypeDbContext(DbContextOptions<TablePerTypeDbContext> options)
1416

1517
protected override void OnModelCreating(ModelBuilder builder)
1618
{
17-
builder.Entity<Vehicle>().ToTable("Vehicles");
18-
builder.Entity<Bike>().ToTable("Bikes");
19-
builder.Entity<Tandem>().ToTable("Tandems");
20-
builder.Entity<MotorVehicle>().ToTable("MotorVehicles");
21-
builder.Entity<Car>().ToTable("Cars");
22-
builder.Entity<Truck>().ToTable("Trucks");
23-
24-
builder.Entity<Wheel>().ToTable("Wheels");
25-
builder.Entity<CarbonWheel>().ToTable("CarbonWheels");
26-
builder.Entity<ChromeWheel>().ToTable("ChromeWheels");
27-
28-
builder.Entity<Engine>().ToTable("Engines");
29-
builder.Entity<GasolineEngine>().ToTable("GasolineEngines");
30-
builder.Entity<DieselEngine>().ToTable("DieselEngines");
31-
32-
builder.Entity<GenericProperty>().ToTable("GenericProperties");
33-
builder.Entity<StringProperty>().ToTable("StringProperties");
34-
builder.Entity<NumberProperty>().ToTable("NumberProperties");
19+
builder.Entity<Vehicle>()
20+
.UseTptMappingStrategy();
21+
22+
builder.Entity<Wheel>()
23+
.UseTptMappingStrategy();
24+
25+
builder.Entity<Engine>()
26+
.UseTptMappingStrategy();
27+
28+
builder.Entity<GenericProperty>()
29+
.UseTptMappingStrategy();
3530

3631
base.OnModelCreating(builder);
3732
}

test/TestBuildingBlocks/DbContextExtensions.cs

+12-2
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,18 @@ private static async Task ClearTablesAsync(this DbContext dbContext, params Type
3434
throw new InvalidOperationException($"Table for '{model.Name}' not found.");
3535
}
3636

37-
string tableName = entityType.GetTableName()!;
38-
await dbContext.Database.ExecuteSqlRawAsync($"delete from \"{tableName}\"");
37+
string? tableName = entityType.GetTableName();
38+
39+
if (tableName == null)
40+
{
41+
// There is no table for the specified abstract base type when using TablePerConcreteType inheritance.
42+
IEnumerable<IEntityType> derivedTypes = entityType.GetConcreteDerivedTypesInclusive();
43+
await ClearTablesAsync(dbContext, derivedTypes.Select(derivedType => derivedType.ClrType).ToArray());
44+
}
45+
else
46+
{
47+
await dbContext.Database.ExecuteSqlRawAsync($"delete from \"{tableName}\"");
48+
}
3949
}
4050
}
4151
}

0 commit comments

Comments
 (0)