首页 文章

EF Core:同时使用ID作为主键和外键

提问于
浏览
1

我有两个参与者,Prospect和person,我正在尝试做的是使用Prospect.ID作为ProspectTable的主键和PersonID的外键,我的ideia对两个实体都使用相同的ID而不需要我的PersonID展望实体 . 当潜在客户被保存在数据库中时,它会尝试保存PersonID,即使我没有在我的Prospect实体上拥有此属性,我想知道ef核心是否支持这种关系 .

这是我在模型构建器上得到的 .

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); });

这是在数据库上执行的内容:

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; }
}

谢谢 .

2 回答

  • -2

    仅使用属性,不使用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();
    }
    

    我不知道FluentAPI中 ForeignKey 的等价物 . 所有其他(Key和InverseProperty)都是可配置的,但为什么要使用两种方法而不是一种 .

    上面的代码生成以下迁移代码:

    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);
            });
    }
    

    看起来非常接近您的需求 .

  • 5

    如果您将关系建模为one:one,则EF将自动使用Principal的PK作为依赖关系的FK .

    ModelBuilder.Entity<ProspectDto>().HasRequired(p => p.Person).WithRequiredDependent();
    

    请注意 ProspectDto 在DB上仍然有一个 ID 列(继承自DtoBase),但FK关系将在 ProspectDto.IDPersonDto.ID 之间,并且不应该有 ProspectDto.PersonId 列 .

相关问题