一对多级联删除与多对多原因异常

时间:2012-08-12 18:53:35

标签: c# entity-framework-4 ef-code-first

我的代码工作正常,直到我添加了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下将web连接字符串添加到web.config:

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

当已存在一对多关系时,如何在删除时启用级联创建循环关系?它是说在级联删除中有一个循环吗?如何,当我指定的唯一级联是User - &gt;文献?我如何解决它?谢谢!

1 个答案:

答案 0 :(得分:0)

级联删除错误不一定是由于循环关系造成的,但是通过在删除树中对同一个表进行多次引用,请参阅this post

触发器是删除:

  • 用户 - &gt;文件 - &gt; DocumentAdministrator
  • 用户 - &gt; DocumentAdministrator。

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