EFコア:IDをプライマリキーと外部キーとして同時に使用する

c# ef-model-builder entity-framework-core

質問

私は2つのエントリーを持っています。プロスペクトと人は、ProspectTableをプロスペクトテーブルのプライマリキーとして使用し、PersonIDの外部キーとして使用します。私のイデアは、私のPersonIDを必要とせずに両方のエンティティに同じIDを使用します。プロスペクトエンティティ。見込み客がデータベースに保存されているとき、Prospectエンティティにこのプロパティがない場合でもPersonIDを保存しようとしますが、ef coreがこの種の関係をサポートしているかどうかを知りたいと思います。

私のモデルビルダーには次のようなものがあります。

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

ありがとう。

受け入れられた回答

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)は設定可能ですが、代わりに2つの方法を使用するのはなぜですか。

上記のコードは、次の移行コードを生成します。

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

あなたが必要とするものに非常に近いように見えます。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ