dotnet / dotnet/efcore

Improve join table FK detection

Open
#33,603 1 comment 1 reaction 1 assignee Claimed by @AndriySvyryd View on GitHub
area-conventions area-model-building customer-reported
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.