一对多级联删除沿多对多导致异常

Posted

技术标签:

【中文标题】一对多级联删除沿多对多导致异常【英文标题】:One-to-Many Cascade Delete Along side Many-to-Many Causes Exception 【发布时间】:2012-08-12 18:53:34 【问题描述】:

在我添加 WillCascadeOnDelete(true) 之前,我的代码运行良好。

异常:InvalidOperationException - 数据库创建成功,但数据库对象的创建没有成功。有关详细信息,请参阅内部异常。

内部异常:System.Data.SqlServerCe.SqlCeException - 引用关系将导致不允许的循环引用。 [约束名称 = User_AdministratorOf_Target]

最小复制(在新的 MVC3 Web 应用项目中):

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;

public class User

    [Key]
    public string UserName  get; set; 
    public virtual ICollection<Document> Documents  get; set; 
    public virtual ICollection<Document> AdministratorOf  get; set; 


public class Document

    public int Id  get; set; 
    public User Owner  get; set; 
    public ICollection<User> Administrators get; set; 


public class EntityMappingContext : DbContext

    public DbSet<User> Users  get; set; 
    public DbSet<Document> Documents  get; set; 

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        modelBuilder.Entity<User>()
            .HasMany(x => x.AdministratorOf)
            .WithMany(x => x.Administrators)
            .Map(x =>
            
                x.MapLeftKey("UserName");
                x.MapRightKey("Document");
                x.ToTable("DocumentAdministrators");
            );
        modelBuilder.Entity<Document>()
            .HasRequired(x => x.Owner)
            .WithMany(x => x.Documents)
            .WillCascadeOnDelete(true);
        base.OnModelCreating(modelBuilder);
    


当然还得在connectionStrings下添加SQL连接字符串到web.config中:

<add name="EntityMappingContext" connectionString="Data Source=|DataDirectory|Error.sdf" providerName="System.Data.SqlServerCe.4.0"/>

当一对多关系已经存在时,在删除时启用级联如何创建循环关系?是不是说级联删除有循环?当我指定的唯一级联是用户-> 文档时,如何?我如何解决它?谢谢!

【问题讨论】:

【参考方案1】:

级联删除错误不一定是由于循环关系,而是由于在删除树中对同一个表有多个引用,请参阅this post。

触发器是删除:

用户 -> 文档 -> 文档管理员 用户 -> 文档管理员。

通过删除用户,它会触发多对多表的删除两次,从而导致错误。最好只删除业务逻辑中属于所有者的所有文档。

【讨论】:

以上是关于一对多级联删除沿多对多导致异常的主要内容,如果未能解决你的问题,请参考以下文章

ACCESS级联删除一对多关系的记录

2018.11.4 Hibernate中多对多的关系

具有多对多关系的级联删除[重复]

休眠 - 多对多关系中的级联删除

同一张表之间多对多的级联删除

hibernate多对多双向关系映射的级联配置