ras*_*s91 16 c# entity-framework-core .net-core asp.net-core-2.0 ef-core-2.0
我目前在EF Core遇到了一些问题.我有一些我需要删除的数据,我很想知道流畅的API如何工作,完全与.OnDelete()
函数有关.
考虑到微软自己的网站的经典博客/帖子情景,我想知道什么实体,正是OnDelete()
"目标"(缺乏一个更好的词)在某些情况下,它似乎是博客,在其他情况下,帖子.是否可以从双方定义Cascade删除(当父博客是删除帖子时),如果是这样,我想代码应该如下所示:
model.Entity<Post>().HasOne(p => p.Blog).WithMany(b => b.Posts).HasForeignKey(p => p.BlogId).OnDelete(DeleteBehavior.Cascade)
据我所知,这是说"当博客被删除时,首先删除引用此博客的所有帖子"意味着OnDelete(DeleteBehavior.Cascade)
适用于博客,而不是发布.
但这是一样的吗?
model.Entity<Blog>().HasMany(b => b.Posts).WithOne(p => p.Blog).OnDelete(DeleteBehavior.Cascade)
或者是否OnDelete(DeleteBehavior.Cascade)
适用于Post而不是博客?
Iva*_*oev 30
级联删除始终在一个方向上工作 - 从主体实体到依赖实体,即删除主体实体删除依赖实体.而对于一对多的关系的一个侧面始终是主要和很多方面是依赖.
看起来你对流畅的配置感到困惑.请注意,每个关系由两端组成.流畅的配置允许您从一端开始并将其与另一端相关联,反之亦然,但您仍在配置(定义)单个关系.所以
Entity<A>().HasOne(a => a.B).WithMany(b => b.As)
Run Code Online (Sandbox Code Playgroud)
是相同的
Entity<B>().HasMany(b => b.As).WithOne(a => a.B);
Run Code Online (Sandbox Code Playgroud)
他们都定义了一个相同的关系.您选择哪一个并不重要,只需为每个关系使用单个配置以避免出现差异.
话虽如此,
model.Entity<Post>().HasOne(p => p.Blog).WithMany(b => b.Posts)
.HasForeignKey(p => p.BlogId)
.OnDelete(DeleteBehavior.Cascade);
Run Code Online (Sandbox Code Playgroud)
和
model.Entity<Blog>().HasMany(b => b.Posts).WithOne(p => p.Blog)
.HasForeignKey(p => p.BlogId)
.OnDelete(DeleteBehavior.Cascade);
Run Code Online (Sandbox Code Playgroud)
是一个且相同的,并定义单一到许多从关系Blog
到Post
.由于Blog
是一个侧和Post
是许多方面,Blog
是主要实体和Post
是依赖实体,因此,删除Blog
将删除相关Post
秒.
参考:
归档时间: |
|
查看次数: |
13224 次 |
最近记录: |