使用实体框架中的可选记录进行级联删除

本文关键字:记录 级联 删除 实体 框架 | 更新日期: 2023-09-27 18:36:02

我正在尝试使用实体框架开发一个 ASP.net MVC 应用程序,在过去的大约 8 小时内,我试图修复一些没有成功的东西。我有3种型号,OverhourAccountingVacationOverhour是父模型,一旦我们创建一个 Overhour ,我们可以用它创建一个AccountingVacation记录一次。我们不需要创建一个,因此我们可以拥有一个没有AccountingVacationOverhour。重要的是,当我们删除一个 Overhour ,我们应该同时删除AccountingsVacations(如果它们存在)。

首先使用代码,我尝试使用数据注释,但似乎您无法使用可选模型做到这一点,所以我现在使用 Fluent API。这是我用于OverhourAccounting之间关系的东西:

modelBuilder.Entity<Overhour>()
.HasOptional<Accounting>(s => s.Accounting)
.WithOptionalPrincipal()
.WillCascadeOnDelete(true);

即使我使用 CodeFirst,我也使用插件来创建模型图以进行测试,并且模型看起来也不错(我猜):

图表(似乎我不能直接包含图像)

据我了解,它说"Cascade on End1Delete"。因此,当我删除Overhour时,会计记录也应该被删除,但它不起作用,它只是将其设置为 null。

另一件事是,我不确定哪一个是父母。我的意思是,我应该有一个这样的Overhour模型:

class Overhour {
    ...
    public int AccountingId { get; set; }
    public virtual Accounting Accounting { get; set; }
}

或者像这样:

class Overhour {
    ...
    public virtual Accounting Accounting { get; set; }
}

或者也许我应该将此属性包含在会计模型中?喜欢这个:

class Accounting {
    ...
    public virtual Overhour Overhour { get; set; }
}

也许我需要两者兼而有之?

我很困惑,有什么想法吗?

谢谢

使用实体框架中的可选记录进行级联删除

我能够使用以下方法使用可选记录进行级联删除:

public class Overhour
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual Guid Id { get; set; }
}
public class Accounting
{
    [ForeignKey("Overhour")]
    public virtual Guid Id { get; set; }
    public virtual Overhour Overhour { get; set; }
}
public class Vacation
{
    [ForeignKey("Overhour")]
    public virtual Guid Id { get; set; }
    public virtual Overhour Overhour { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Accounting>()
        .HasRequired(accounting => accounting.Overhour)
        .WithOptional()
        .WillCascadeOnDelete(true);
    modelBuilder.Entity<Vacation>()
        .HasRequired(vacation => vacation.Overhour)
        .WithOptional()
        .WillCascadeOnDelete(true);
}