为EF Code First启用CascadeOnDelete

时间:2013-08-20 14:41:44

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

我试图为我们的数据库设置CacadeOnDelete,这样如果删除Folder,则所有子文件夹也会被删除。

Folder设置如此

public class Folder
{
    [Key]
    public int FolderId { get; set; }
    public string Name { get; set; }
    public Folder Parent { get; set; }

    [ForeignKey("Parent")]
    public int ParentFolderId { get; set; }

    public virtual ICollection<Folder> Children { get; set; }
    public virtual ICollection<Device> Devices { get; set; }
}

我试图像这样设置级联删除,但是当我运行它时,数据库生成永远不会完成,尽管我也没有例外

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Folder>()
        .HasMany(x => x.Devices)
        .WithMany(x => x.PresentInFolders);

    modelBuilder.Entity<Folder>()
        .HasOptional(f => f.Parent)
        .WithMany(f => f.Children)
        .HasForeignKey(f => f.ParentFolderId)
        .WillCascadeOnDelete();
}

1 个答案:

答案 0 :(得分:1)

问题是在FolderFolder之间宣布您的关系。

如果我查看您的模型,您有一个包含许多子项的文件夹,但文件夹具有唯一的父项。但是,您在模型构建器中设置了“多对多”关系。

尝试创建此关系:

modelBuilder.Entity<Folder>()
    .HasOptional(f => f.Parent)
    .WithMany(f => f.Children)
    .HasForeignKey(f => f.ParentFolderId)
    .WillCascadeOnDelete();

你必须在你的文件夹上添加一个ParentFolderId属性,我认为它会起作用。您可以查看this example from msdn

希望它有所帮助!