一对多级联删除沿多对多导致异常
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。
触发器是删除:
用户 -> 文档 -> 文档管理员 用户 -> 文档管理员。通过删除用户,它会触发多对多表的删除两次,从而导致错误。最好只删除业务逻辑中属于所有者的所有文档。
【讨论】:
以上是关于一对多级联删除沿多对多导致异常的主要内容,如果未能解决你的问题,请参考以下文章