【发布时间】:2019-11-28 20:57:39
【问题描述】:
我有两个实体,Tag 和 Member。一个成员可以标记多个标签。一个标签可用于标记多个成员。这是多对多关系的一个明显例子,因为我使用的是 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);
我应该使用 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);
}
【问题讨论】:
标签: c# entity-framework entity-framework-core ef-core-2.0