gpt4 book ai didi

c# - 如何使用 Fluent API 正确控制 EF Core 中的级联删除?

转载 作者:行者123 更新时间:2023-11-30 15:13:53 24 4
gpt4 key购买 nike

我有两个实体,标签成员。一个成员可以标记多个标签。一个标签可以用来标记多个成员。这是一个明显的多对多关系案例,因为我使用的是 EF Core,所以我必须声明一个显式连接器,我将其称为 Tag_Member。我按以下方式配置它。

private void OnModelCreating(EntityTypeBuilder<Tag_Member> entity)
{
entity.HasKey(e => new { e.TagId, e.MemberId });
entity.HasOne(e => e.Tag);
entity.HasOne(e => e.Member)
.WithMany(e => e.Tag_Member)
.HasForeignKey(e => e.MemberId);
}

删除时我希望强制执行的行为如下。

  • 删除 Tag_Member 的实例时,没有任何改变。
  • 删除 Tag 的实例时,所有连接的 Tag_Member 实例都会被删除。
  • 删除 Member 的实例时,所有连接的 Tag_Member 实例都会被删除。

我对两点感到困惑。当我如下所示添加删除条件时,我有很多选项可供选择,尽管阅读了智能感知,但我不确定要使用哪个来强制执行上述行为。

entity.HasOne(e => e.Member)
.WithMany(e => e.Tag_Member)
.HasForeignKey(e => e.MemberId)
.OnDelete(DeleteBehavior.NoAction);

我应该使用 NoActionClientNoActionRestrict 还是其他?我什至不清楚删除行为影响了哪些实体。是哪个?

第二个困惑是我没有让 OnDelete() 出现在标签配置中。我没有使用 WithMany(),因为该实体缺少对互连实体的引用。我仍然可以管理它的删除行为吗?我是否需要显式声明它才能实现请求的行为?

entity.HasOne(e => e.Tag)
.OnDelete(DeleteBehavior.NoAction);

这些类大致如下所示。

public class Tag { public Guid Id { get; set; } }
public class Member { public Guid Id { get; set; } }

public class Tag_Member
{
public Guid TagId { get; set; }
public Guid MemberId { get; set; }
public Tag Tag { get; set; }
public Member Member { get; set; }
}

我的引用主要是thisthis .

编辑:根据答案中的建议,这是成员和标签之间关系的最终版本。

private static void OnModelCreating(EntityTypeBuilder<Member> entity)
{
entity.HasKey(e => e.Id); ...
}

private static void OnModelCreating(EntityTypeBuilder<Tag> entity)
{
entity.HasKey(e => e.Id); ...
}

private static void OnModelCreating(EntityTypeBuilder<Member_Tag> entity)
{
entity.HasKey(e => new { e.MemberId, e.TagId });
entity.HasOne(e => e.Member).WithMany().OnDelete(DeleteBehavior.NoAction);
entity.HasOne(e => e.Tag).WithMany().OnDelete(DeleteBehavior.NoAction);
}

最佳答案

I'm not even clear on which of hte entities that the deletetion behavior affects. Which is it?

这很简单。级联删除始终影响依赖实体(即包含 FK 的实体)。

I don't feel certain which to use to enforce the above behavior. Should I use NoAction, ClientNoAction, Restrict or someting else?

您似乎正在使用 EF Core 3.0 预览版,它添加了更多尚未记录的选项。但是在数据库级别实现的经典级联删除选项一直是Cascade

I haven't used WithMany() because that entity lacks references back to the interlinking entity.

为了能够流畅地配置关系方面,您必须使用 Has + With 对来完全指定关系方。由于 导航属性 对关系的任何一方都不是强制性的,因此您只需要它来将正确的参数传递给 Has/With 方法 - 如果您确实具有导航属性,传递名称或 lambda 表达式访问器,否则不传递任何内容(但仍包括调用)。例如

entity.HasOne(e => e.Tag)
.WithMany() // <--
.OnDelete(DeleteBehavior.Cascade); // now you can do this

但请注意,DeleteBehavior.Cascade必需 关系的默认(换句话说,当 FK 是不可空类型时),所以你通常不需要流畅的配置。如果属性名称遵循 EF Core 命名约定,则根本不需要流畅的配置。

简单例子可见here .

关于c# - 如何使用 Fluent API 正确控制 EF Core 中的级联删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57119657/

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