c# - ASP.NET MVC。如何手动将 "cascade delete"添加到代码优先关系中?

标签 c# asp.net-mvc entity-framework ef-code-first code-first

如何在不将导航属性设置为 [Required] 或不可为 nullable 的情况下配置对 Code First 项目的级联删除?

例如:

class MainClass{
    [Key] int id {get;set;}
    public string name {get;set;}
    public virtual ICollection<SubItem> subItems {get;set}
}

Class SubItem{
    [Key] int id {get; set;}
    public string name {get;set;}
}

删除主类应该删除所有相关的子项

最佳答案

要通过首先设置的代码对可空外键进行级联删除,实现此目的的最佳方法可能是通过 Fluent API。

将此 Fluent API 代码添加到您的 DBContext:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<SubItem>()
            .HasOptional(o => o.MainClass)
            .WithMany(m => m.subItems)
            .HasForeignKey(k => k.MainClassId)
            .WillCascadeOnDelete(true);
}

并且您的 SubItem 类需要使用这些属性进行更新:

Class SubItem
{
    [Key] int id {get; set;}
    public string name {get;set;}
    public int? MainClassId { get; set;}
    public virtual MainClass MainClass { get; set; }
}

我相信,如果您要删除 MainClass 项,则必须在要删除的上下文中加载子项(在拉取 MainClass 对象时使用 include 语句)。

但是如果你进入你的数据库并设置这个外键以启用级联删除,那么你将不必将子项加载到上下文中,因为数据库会在你删除时为你处理级联删除MainClass 对象被删除。

关于c# - ASP.NET MVC。如何手动将 "cascade delete"添加到代码优先关系中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39113219/

相关文章:

javascript - 当您的应用程序使用客户端和服务器端 mvc 框架时,如何处理路由?

asp.net-mvc - UserVoice 的客户反馈替代方案?

c# - EF Core 执行sql

c# - MVC5 EF6 种子方法 : Cannot insert NULL into column 'Id' table AspNetUsers

c# - 表示层控制修改

c# - TagHelper 指定有效属性

javascript - 良好的时间跨度图形表示?

c# - "Argument data type ntext is invalid for argument 1 of upper function"尝试将第三个项目添加到过滤器时

c# - UWP - 如果另一个应用程序打开文件,则无法打开文件进行阅读

c# - 对一次性对象使用 Await Async WhenAll