I have got an abstract class called Building
public abstract class Building
{
public Guid Id { get; set; }
public string Name { get; set; }
...
}
and some inheritances:
public class ManufacturingFacilityBuilding : Building
{
public List<InputResource> InputResources { get; set; }
...
}
public class RefineryBuilding : Building
{
public List<InputResource> InputResources { get; set; } = new();
...
}
public class ResearchLaboratoryBuilding : Building
{
public List<InputResource> InputResources { get; set; } = new();
...
}
And the InputResource
class:
public class InputResource
{
public Guid Id { get; set; }
public Guid BuildingId { get; set; }
public virtual Building Building { get; set; }
}
The ModelBuilder for the buildings looks like this:
public class ManufacturingFacilityBuildingEntityTypeConfiguration : IEntityTypeConfiguration<ManufacturingFacilityBuilding>
{
public void Configure(EntityTypeBuilder<ManufacturingFacilityBuilding> builder)
{
builder.ToTable("ManufacturingFacilityBuildings");
builder.Property(e => e.Id).IsRequired().HasDefaultValueSql("(newid())");
builder.HasBaseType<Building>();
builder.HasMany(e => e.InputResources)
.WithOne(e => e.Building as ManufacturingFacilityBuilding)
.HasForeignKey(e => e.BuildingId);
}
}
public class RefineryBuildingEntityTypeConfiguration : IEntityTypeConfiguration<RefineryBuilding>
{
public void Configure(EntityTypeBuilder<RefineryBuilding> builder)
{
builder.ToTable("RefineryBuildings");
builder.Property(e => e.Id).IsRequired().HasDefaultValueSql("(newid())");
builder.HasBaseType<Building>();
builder.HasMany(e => e.InputResources)
.WithOne(e => e.Building as RefineryBuilding)
.HasForeignKey(e => e.BuildingId);
}
}
public class ResearchLaboratoryBuildingEntityTypeConfiguration : IEntityTypeConfiguration<ResearchLaboratoryBuilding>
{
public void Configure(EntityTypeBuilder<ResearchLaboratoryBuilding> builder)
{
builder.ToTable("ResearchLaboratoryBuildings");
builder.Property(e => e.Id).IsRequired().HasDefaultValueSql("(newid())");
builder.HasBaseType<Building>();
builder.HasMany(e => e.InputResources)
.WithOne(e => e.Building as ResearchLaboratoryBuilding)
.HasForeignKey(e => e.BuildingId);
}
}
So finally what I expect from the migration is something like this:
migrationBuilder.CreateTable(
name: "InputResources",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false, defaultValueSql: "(newid())"),
BuildingId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
},
constraints: table =>
{
table.PrimaryKey("PK_InputResources", x => x.Id);
table.ForeignKey(
name: "FK_InputResources_ManufacturingFacilityBuildings_BuildingId",
column: x => x.BuildingId, // <= Watch this property
principalTable: "ManufacturingFacilityBuildings",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_InputResources_RefineryBuildings_BuildingId",
column: x => x.BuildingId, // <= Watch this property
principalTable: "RefineryBuildings",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_InputResources_ResearchLaboratoryBuildings_BuildingId",
column: x => x.BuildingId, // <= Watch this property
principalTable: "ResearchLaboratoryBuildings",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
The InputResource
should have it's FK directly on BuildingId
.
But when I create the migration, it generates something like this:
migrationBuilder.CreateTable(
name: "InputResources",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false, defaultValueSql: "(newid())"),
BuildingId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
ManufacturingFacilityBuildingId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
RefineryBuildingId = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_InputResources", x => x.Id);
table.ForeignKey(
name: "FK_InputResources_ManufacturingFacilityBuildings_ManufacturingFacilityBuildingId",
column: x => x.ManufacturingFacilityBuildingId, // <= This is where the problem begins
principalTable: "ManufacturingFacilityBuildings",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_InputResources_RefineryBuildings_RefineryBuildingId",
column: x => x.RefineryBuildingId, // <= This is where the problem begins
principalTable: "RefineryBuildings",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_InputResources_ResearchLaboratoryBuildings_BuildingId",
column: x => x.BuildingId, // <= This is as it should be
principalTable: "ResearchLaboratoryBuildings",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
As you can see the migration creates a custom column foreach (except one) building. Is this intended or am I doing something wrong here?
I am using .Net 5 with EF-Core 5.0