我有两个实体,标签和成员。一个成员可以被多个标签标记。一个标签可以用来标记多个成员。这是一个明显的多对多关系,由于我使用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);
}
我希望实现的删除行为如下:
- 删除的实例时,不做任何更改。
- 删除的实例时,将删除任何连接的实例。
- 删除的实例时,将删除任何连接的实例。
我有两个困惑。当我添加如下的删除条件时,我有很多选项可供选择,并且尽管阅读了智能感知,我仍然不确定应该使用哪个来实现上述行为。
entity.HasOne(e => e.Member)
.WithMany(e => e.Tag_Member)
.HasForeignKey(e => e.MemberId)
.OnDelete(DeleteBehavior.NoAction);
我应该使用NoAction,ClientNoAction,Restrict还是其他什么?我甚至不清楚删除行为影响哪些实体。它是哪个?
第二个困惑点是,我无法在标记配置中看到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; }
}
我的参考资料主要是这个和这个。 编辑:根据答案中的建议,这是成员和标签之间关系的最终版本。
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);
}
Tag
和Member
是主体,而连接实体则依赖于这两个关系。因此,级联操作会按照您的期望方式正常工作——删除Tag
或Member
将同时删除相关链接,但不会删除链接中的“其他”对象。 - Ivan Stoeva.HasMany(a => a.Bs).WithOne(b => b.A)
与b.HasOne(b => b.A).WithMany(a => a.Bs)
完全相同,两者都代表同一个关系。因此,你只需要2个流畅的配置,因为你有2个关系。 - Ivan StoevCascade
,因为您正在配置删除“主要男子”时会发生什么。(2)如果您在主要男人中具有集合导航属性,则.WithMany()
将导致问题,就像最初的代码所示。 确保使用.WithMany(e => e.Tag_Member)
而不是。 - Ivan Stoev