从联接表中删除实体而不影响父级 - EF Core 2.2

Posted

技术标签:

【中文标题】从联接表中删除实体而不影响父级 - EF Core 2.2【英文标题】:Remove entity from joint table without affecting parent - EF Core 2.2 【发布时间】:2021-09-05 03:12:09 【问题描述】:

我遇到了多对多关系的问题,我不明白为什么会这样:

所以我有以下内容:

public class A 

    public Guid Guid  get; set; 
    
    public ICollection<AB> ABs  get; set; 

public class B 

    public Guid Guid  get; set; 
    
    public ICollection<AB> ABs  get; set; 

public class AB 

    public Guid Guid  get; set; 
    public A A  get; set; 
    public Guid A_Id  get; set; 
    public B B  get; set; 
    public Guid B_Id  get; set; 

    internal static void OnModelCreating(ModelBuilder builder)
    
        builder.Entity<AB>(entity =>
        
            entity.HasIndex(e => new  e.A_Id, e.B_Id).IsUnique();

            entity.HasOne(e => e.A)
                .WithMany(p => p.ABs)
                .HasForeignKey(e => e.A_Id)
                .OnDelete(DeleteBehavior.Restrict);
                
            entity.HasOne(e => e.B)
                .WithMany(w => w.ABs)
                .HasForeignKey(e => e.B_Id)
                .OnDelete(DeleteBehavior.Restrict);
            );
        

我不断得到:

实体类型“A”和“AB”之间的关联已被切断,但 该关系要么标记为“必需”,要么隐含 需要,因为外键不可为空。如果 当需要关系时,应删除依赖/子实体 被切断,然后设置关系以使用级联删除。 考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来 查看关键值。

问题是我想通过从 A.AB 中删除 AB 来打破关系,而 EF Core 试图删除 A。我不明白发生了什么。有什么想法吗?

最好的问候

【问题讨论】:

【参考方案1】:

您为什么在 AB 类中进行模型创建?它应该在 dbcontext 中。

并尝试为您的 AB 类添加一个密钥。由于您使用的是 v.2.2,它将使 EF 更加可靠。

public class A 

    public Guid Id get; set; 
    
    public ICollection<AB> ABs  get; set; 

public class B 

    public Guid Id  get; set; 
    
    public ICollection<AB> ABs  get; set; 

public class AB 
   
    public Guid Id  get; set;     
    public A A  get; set; 
    public Guid A_Id  get; set; 
    public B B  get; set; 
    public Guid B_Id  get; set; 

【讨论】:

关于模型创建在这个地方,因为我的团队选择这样做,我别无选择。 另外,我确实有 AB 类的 guid,我忘了添加它

以上是关于从联接表中删除实体而不影响父级 - EF Core 2.2的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Core Data 中删除数据

EF Core 删除对自身的引用而不删除

使用 EF Core 保存附加实体时如何删除子实体

从查询 C#、EF Core 返回一个值

如何删除一列并创建一个新列而不是在 EF Core 中重命名?

如何过滤 EF Core 中的多对多联接