Improve join table FK detection
- Dominant language
- C#
- Stars
- 14.8k
- Forks
- 3.4k
- PR merge metrics
- PR metrics pending
Description
``` C#
modelBuilder.Entity()
.HasMany(e => e.LaborResources)
.WithMany(e => e.LaborResourceGroups)
.UsingEntity();
public class LaborVsGroup : IAuditableEntity, IWriteAccessEntity
{
[Key]
public int Id { get; set; }
[ForeignKey(nameof(LaborResource))]
public int LaborResourceId { get; set; }
[ForeignKey(nameof(LaborResourceGroup))]
public int LaborResourceGroupId { get; set; }
public string CreatedBy { get; set; } = string.Empty;
public DateTime CreatedOn { get; set; }
public virtual LaborResource LaborResource { get; set; } = null!;
public virtual LaborResourceGroup LaborResourceGroup { get; set; } = null!;
}
public class LaborResource : BaseObject, IAuditableEntity, IWriteAccessEntity
{
public string? Email { get; set; }
public string CreatedBy { get; set; } = string.Empty;
public DateTime CreatedOn { get; set; }
public virtual List? LaborResourceGroups { get; } = [];
}
public class LaborResourceGroup : BaseObject, IAuditableEntity, IWriteAccessEntity
{
public string CreatedBy { get; set; } = string.Empty;
public DateTime CreatedOn { get; set; }
public virtual List? LaborResources { get; } = [];
}
```
Generate Migration:
``` C#
migrationBuilder.CreateTable(
name: "LaborVsGroup",
schema: "Reference",
columns: table => new
{
Id = table.Column(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
LaborResourceId = table.Column(type: "int", nullable: false),
LaborResourceGroupId = table.Column(type: "int", nullable: false),
CreatedBy = table.Column(type: "nvarchar(max)", nullable: false),
CreatedOn = table.Column(type: "datetime2", nullable: false),
LaborResourceGroupsId = table.Column(type: "int", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_LaborVsGroup", x => x.Id);
table.ForeignKey(
name: "FK_LaborVsGroup_LaborResourceGroup_LaborResourceGroupId",
column: x => x.LaborResourceGroupId,
principalSchema: "Reference",
principalTable: "LaborResourceGroup",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_LaborVsGroup_LaborResourceGroup_LaborResourceGroupsId",
column: x => x.LaborResourceGroupsId,
principalSchema: "Reference",
principalTable: "LaborResourceGroup",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_LaborVsGroup_LaborResource_LaborResourceId",
column: x => x.LaborResourceId,
principalSchema: "Reference",
principalTable: "LaborResource",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
```
Why column & FK LaborResourceGroupsId created?
```
LaborResourceGroupsId = table.Column(type: "int", nullable: false)
table.ForeignKey(
name: "FK_LaborVsGroup_LaborResourceGroup_LaborResourceGroupsId",
column: x => x.LaborResourceGroupsId,
principalSchema: "Reference",
principalTable: "LaborResourceGroup",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
```
If I updated the join table to remove the virtual Navigation property, it works. So strange.
```
public class LaborVsGroup : IAuditableEntity, IWriteAccessEntity
{
[Key]
public int Id { get; set; }
public int LaborResourceId { get; set; }
public int LaborResourceGroupId { get; set; }
public string CreatedBy { get; set; } = string.Empty;
public DateTime CreatedOn { get; set; }
}
```
EF Version: 8.0.4
Contributor guide
Assessment
This issue has not been assessed yet.