2016-08-24 71 views
2

如何在没有将导航属性设置为[必需]或不可空的情况下将级联删除配置到代码优先项目?ASP.NET MVC。如何手动添加“级联删除”到代码第一关系?

例如:

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;} 
} 

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

回答

1

要具有级联通过先建立一个代码删除对空的外键,实现这一目标的最佳方式可能是通过Fluent API。

这流利的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 SubItem 
{ 
    [Key] int id {get; set;} 
    public string name {get;set;} 
    public int? MainClassId { get; set;} 
    public virtual MainClass MainClass { get; set; } 
} 

我相信,如果要删除的MainClass项目的子项目必须在上下文中加载(使用一个包含语句,当拉动MainClass对象时)将被删除。

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

+0

我尝试过,但似乎1x1,而不是1xMany依赖。 –

+1

@DanielSantos对不起,我错了。我修复了它,并更新了我过去如何做到的答案。 – JustSomeDude