EF Core:如何在DB-first FK错误的方式下级联删除?

问题描述 投票:0回答:1

考虑遗留数据库的这个(公认的相当混乱)实体模型:

enter image description here

你可以看到它模型Blogs有一个Entrys集合,指向博客Post各自。箭头的提示指向关系的主要/父级。至少这是EF核心根据外键存储位置看待它的方式。

不幸的是,EntryPost之间的FK是错误的方式,因为Post实际上是Entry的孩子;即当我从Entry删除Blog时,也应该删除相关的Post

由于我无法改变遗留数据库的模式,我想知道如何设法EF级联删除Posts虽然它不认为它们是Entrys的孩子。

我试着明确指定qazxsw poi无济于事:

DeleteBehavior

我也尝试使导航属性modelBuilder.Entity<Entry>() .HasOne(e => e.Post) .WithOne(p => p.Entry) .OnDelete(DeleteBehavior.Cascade); 需要表明Post.Entry不能没有它的Post,但这也没有帮助:

Entry

我目前正在检查public class Post { // ... [Required] [InverseProperty(nameof(Entry.Post))] public Entry Entry { get; set; } } 是否有帮助,但我持怀疑态度。

我想我需要的是一种明确说明实体关系的父/主体的方法。像qazxsw poi这样的东西。

当然我总是可以手动删除owned entity types,但我试图避免这种情况。

任何人的想法?

Working example

我创建了一个带有集成测试的SetPrincipalEntityType(),您可以使用它来重现该问题:

Post

测试test project将失败。

c# entity-framework-core cascade
1个回答
0
投票

我在EF Core GitHub页面上发布了相同的问题。 > git clone https://github.com/bert2/ef-vs-garbage-db.git > cd .\ef-vs-garbage-db\ > dotnet test 的想法是在覆盖DeletesTextWhenDeletingReview中找到孤立的实体并手动删除它们:

solution posted there

我接受了这个并构建了一个基于属性的解决方案,您可以在SaveChanges()中找到它。

© www.soinside.com 2019 - 2024. All rights reserved.