簡體   English   中英

EF Core 創建多個外鍵列

[英]EF Core creates multiple foreign key columns

我在 .Net Core 3.1 中使用 EF Core

我有一個簡單的客戶端事件關系示例:

public class BaseEntity
{
    [Key]
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime? ModifiedOn { get; set; }

}

public class Client : BaseEntity
{

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }

}

public class Event : BaseEntity
{

    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public Client Client { get; set; }
}

在我的上下文中,我使用FluentAPI來指定關系:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{

    modelBuilder.Entity<Event>()
        .HasOne<Client>()
        .WithMany()
        .IsRequired()
        .OnDelete(DeleteBehavior.Cascade);

}

創建遷移時,客戶端表看起來不錯,但事件表如下所示:

migrationBuilder.CreateTable(
            name: "Events",
            columns: table => new
            {
                Id = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1"),
                CreatedOn = table.Column<DateTime>(nullable: false),
                ModifiedOn = table.Column<DateTime>(nullable: true),
                Start = table.Column<DateTime>(nullable: false),
                End = table.Column<DateTime>(nullable: false),
                ClientId = table.Column<int>(nullable: false),
                ClientId1 = table.Column<int>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Events", x => x.Id);
                table.ForeignKey(
                    name: "FK_Events_Clients_ClientId",
                    column: x => x.ClientId,
                    principalTable: "Clients",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Cascade);
                table.ForeignKey(
                    name: "FK_Events_Clients_ClientId1",
                    column: x => x.ClientId1,
                    principalTable: "Clients",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Cascade);
            });

最后我得到了兩列: ClientIdClientId1 為什么 EntifyFramework 為我的關系創建兩列?

到目前為止,我沒有使用 FluentApi,它僅與自動生成的陰影屬性 ClientId 完美配合,但我需要配置級聯刪除此實體,並且由於沒有其他方法可以做到這一點,因此我指定了如上圖所示的關系。 從那時起,它就有了額外的外鍵列。

我嘗試指定外鍵列:

modelBuilder.Entity<Event>()
            .HasOne<Client>()
            .WithMany()
            .IsRequired()
            .HasForeignKey("ClientId")
            .OnDelete(DeleteBehavior.Cascade);

目前沒有效果。 有沒有辦法告訴 EF im 使用自動生成的陰影屬性?

編輯#1:

我也嘗試過像這樣自己指定外鍵屬性:

public class Event : BaseEntity
{

    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public int ClientId { get; set; }
    public Client Client { get; set; }
}

進而

modelBuilder.Entity<Event>()
    .HasOne<Client>()
    .WithMany()
    .IsRequired()
    .HasForeignKey(e => e.ClientId)
    .OnDelete(DeleteBehavior.Cascade);

但仍然沒有效果。

事實證明,關系可能是空的——將決定留給框架,但這並不能真正滿足您的興趣。 我修改了我的代碼,所以有明確的指向導航屬性,EF 識別出這種關系並停止為列創建陰影屬性:

modelBuilder.Entity<Event>()
    .HasOne<Client>(e => e.Client)
    .WithMany()
    .IsRequired()
    .OnDelete(DeleteBehavior.Cascade);

你可以試試這個:

{

    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public int? ClientId { get; set; }

    [ForeignKey("ClientId ")]
    public virtual Client Client { get; set; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM