考虑遗留数据库的这个(公认的相当混乱)实体模型:
你可以看到它模型Blog
s有一个Entry
s集合,指向博客Post
各自。箭头的提示指向关系的主要/父级。至少这是EF核心根据外键存储位置看待它的方式。
不幸的是,Entry
和Post
之间的FK是错误的方式,因为Post
实际上是Entry
的孩子;即当我从Entry
删除Blog
时,也应该删除相关的Post
。
由于我无法改变遗留数据库的模式,我想知道如何设法EF级联删除Post
s虽然它不认为它们是Entry
s的孩子。
我试着明确指定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,但我试图避免这种情况。
任何人的想法?
我创建了一个带有集成测试的SetPrincipalEntityType()
,您可以使用它来重现该问题:
Post
测试test project将失败。
我在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()
中找到它。