Tengo dos entidades, Prospecto y persona, lo que estoy tratando de hacer es usar Prospect.ID como clave principal en ProspectTable y como clave extranjera de PersonID, mi ideia es usar el mismo ID para ambas entidades sin la necesidad de un PersonID en mi Entidad prospectiva Cuando la perspectiva se está guardando en la base de datos, intenta guardar una PersonID, incluso si no tengo esta propiedad en mi entidad de Prospecto, me gustaría saber si ef core admite este tipo de relación.
Esto es lo que tengo en mi modelo de constructor.
modelBuilder.Entity<ProspectDto>(builder => { builder.ToTable("Prospects"); builder.HasKey(prospect => prospect.ID); });
modelBuilder.Entity<PersonDto>(builder => { builder.HasOne(p => p.Prospect).WithOne().HasForeignKey<ProspectDto>(pe => pe.ID); });
Esto es lo que se está ejecutando en la base de datos:
INSERT INTO [Prospects] ([ID], [PersonID]) VALUES (@p421, @p422)
,
PersonDTO:
public class PersonDto : DtoBase
{
public PersonDto()
{
}
public ProspectDto Prospect { get; set; }
}
ProspectDTO:
public class ProspectDto : DtoBase
{
public ProspectDto()
{
}
public PersonDto Person { get; set; } = new PersonDto();
}
DtoBase:
public abstract class DtoBase
{
public Guid ID { get; protected set; }
}
Gracias.
Usando solo atributos, sin 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();
}
No sé qué es equivalente a ForeignKey
en FluentAPI. Todos los demás (Key y InverseProperty) son configurables, pero ¿por qué utilizar dos métodos en lugar de uno?
El código anterior genera el siguiente código de migración:
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);
});
}
Se ve muy cerca de lo que necesitas.