gpt4 book ai didi

c# - EF Core 创建多个外键列

转载 作者:行者123 更新时间:2023-12-04 00:59:47 24 4
gpt4 key购买 nike

我在 .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; }
}
在我的上下文中,我使用 Fluent API 来指定关系:
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);
});
最后我得到了两列: 客户 ID ClientId1 .为什么 Entity Framework 为我的关系创建两列?
到目前为止,我没有使用 Fluent API,它仅与自动生成的影子属性 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);

关于c# - EF Core 创建多个外键列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59465609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com