EF Core: Using ID as Primary key and foreign key at same time
Using attributes only, without FluentAPI:
public abstract class DtoBase
{
[Key]
public Guid ID { get; protected set; }
}
public class PersonDto : DtoBase
{
[InverseProperty("Person")]
public ProspectDto Prospect { get; set; }
}
public class ProspectDto : DtoBase
{
[ForeignKey("ID")] // "magic" is here
public PersonDto Person { get; set; } = new PersonDto();
}
I don't know what is equivalent of ForeignKey
in FluentAPI. All other (Key and InverseProperty) are configurable, but why use two methods instead one.
Code above generates following migration code:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Persons",
columns: table => new
{
ID = table.Column<Guid>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Persons", x => x.ID);
});
migrationBuilder.CreateTable(
name: "Prospects",
columns: table => new
{
ID = table.Column<Guid>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Prospects", x => x.ID);
table.ForeignKey(
name: "FK_Prospects_Persons_ID",
column: x => x.ID,
principalTable: "Persons",
principalColumn: "ID",
onDelete: ReferentialAction.Cascade);
});
}
Looks very close to what you need.
Here is the FluentAPI equivalent of @dmitry's solution:
// Model classes:
public abstract class DtoBase
{
public Guid ID { get; protected set; }
}
public class PersonDto : DtoBase
{
public ProspectDto Prospect { get; set; }
}
public class ProspectDto : DtoBase
{
public PersonDto Person { get; set; } = new PersonDto();
}
-------------------------------------------------------------------
// DbContext's OnModelCreating override:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ProspectDto>().HasOne(p => p.Person).WithOne().HasForeignKey<ProspectDto>(p => p.ID);
}