ASP.NETMVC。如何手动将 "cascade delete" 添加到代码优先关系中?
ASP.NET MVC. How manually add "cascade delete" to a code first relationship?
如何在不将导航属性设置为 [必需] 或不可为空的情况下配置对 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;}
}
删除主要 class 应该删除所有相关的子项
要通过首先设置的代码对可空外键进行级联删除,实现此目的的最佳方法可能是通过 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);
}
并且您的子项 class 需要使用这些属性进行更新:
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 对象被删除时。
如何在不将导航属性设置为 [必需] 或不可为空的情况下配置对 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;}
}
删除主要 class 应该删除所有相关的子项
要通过首先设置的代码对可空外键进行级联删除,实现此目的的最佳方法可能是通过 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);
}
并且您的子项 class 需要使用这些属性进行更新:
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 对象被删除时。