Xamarin形式、EF Core 5和SQLite:删除时未清除多对多的连接表

r8uurelv  于 2022-12-19  发布在  SQLite
关注(0)|答案(1)|浏览(141)

删除两个实体中的一个时,我的Xamarin.Forms应用程序中多对多关系的连接表似乎没有被正确清除。
我有这些课程:

public class Input
{
    // One-to-many
    public ObservableCollection<InputResult> InputResults { get; set; }

    //...
    // Here are many more entities which shouldn't be relevant for this example
    //...
}

public class InputResult
{
    // One-to-many
    public string ParentInputId { get; set;}

    // Many-to-many
    public ObservableCollection<MyDropdown> MyDropdowns { get; set; }
}

public class MyDropdown
{
    // Many-to-many
    public ObservableCollection<InputResult> InputResults { get; set; }
}

我在DbContext类中配置了如下关系:

modelBuilder.Entity<Input>()
               .HasMany(b => b.InputResults)
               .WithOne()
               .HasForeignKey(b => b.ParentInputId)
               .OnDelete(DeleteBehavior.Cascade);

modelBuilder.Entity<InputResult>()
                .HasMany(b => b.MyDropdowns)
                .WithMany(b => b.InputResults);

假设我之前用InputResults加载了一个Input,然后我在一个helper类中删除了InputResults,如下所示:

Context.RemoveRange(Input.InputResults);

InputResults被正确删除。当我直接查看SQLite数据库时,我仍然看到InputResults和MyDropdown的连接表中的所有条目。为什么仍然有条目?昨天,我们的一个用户在删除一些数据并尝试再次插入相同的数据后,遇到了唯一约束错误。
我很感激你的帮助。

    • 编辑:**

我对夏普回答的评论如下:
配置DbContext时我不能使用OnDelete(DeleteBehavior.Cascade)。不过EF Core似乎自己做得很好。DatabaseContextModelSnapshot.cs中的连接表部分如下所示:

modelBuilder.Entity("InputResultMyDropdown", b =>
{
    b.HasOne("Inputs.MyDropdown", null)
        .WithMany()
        .HasForeignKey("MyDropdownId")
        .OnDelete(DeleteBehavior.Cascade)
        .IsRequired();

    b.HasOne("Inputs.InputResult", null)
        .WithMany()
        .HasForeignKey("InputResultId")
        .OnDelete(DeleteBehavior.Cascade)
        .IsRequired();
});
hgb9j2n6

hgb9j2n61#

DbContext中应该有级联删除行为:

modelBuilder.Entity<InputResult>()
    .HasMany(b => b.MyDropdowns)
    .WithMany(b => b.InputResults)
    .OnDelete(DeleteBehavior.Cascade);

相关问题