上海到北京多遠(yuǎn)百度上如何做優(yōu)化網(wǎng)站
文章目錄
- EF更新和插入時如何忽略更新導(dǎo)航屬性
- 級聯(lián)刪除
- 刪除主體/父實體
- 斷開關(guān)系
- 配置級聯(lián)行為
- 來源
EF更新和插入時如何忽略更新導(dǎo)航屬性
- 使用Ignore方法:
modelBuilder.Entity<Blog>().Ignore(b => b.Posts);
- 使用HasNoKey方法:
modelBuilder.Entity<Blog>().HasNoKey();
- 使用HasNoNavigation方法:
modelBuilder.Entity<Blog>().HasNoNavigation(b => b.Posts);
- 使用HasNoRelationship方法:
modelBuilder.Entity<Blog>().HasNoRelationship(b => b.Posts);
級聯(lián)刪除
刪除主體/父實體
請考慮此簡單模型,其中 Blog 是與 Post(依賴實體/子實體)的關(guān)系中的主體/父實體。 Post.BlogId 是一個外鍵屬性,其值必須與該文章所屬博客中的 Blog.Id 主鍵匹配。
public class Blog
{public int Id { get; set; }public string Name { get; set; }public IList<Post> Posts { get; } = new List<Post>();
}public class Post
{public int Id { get; set; }public string Title { get; set; }public string Content { get; set; }public int BlogId { get; set; }public Blog Blog { get; set; }
}
按照約定,由于 Post.BlogId 外鍵屬性是不可為 null 的,因此該關(guān)系被配置為必需的。 默認(rèn)情況下,所需的關(guān)系配置為使用級聯(lián)刪除。 要詳細(xì)了解建模關(guān)系,請參閱關(guān)系。
刪除博客時,所有文章都將被級聯(lián)刪除。 例如:
using var context = new BlogsContext();var blog = context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).First();context.Remove(blog);context.SaveChanges();
SaveChanges 以 SQL Server 為例,生成以下 SQL:
-- Executed DbCommand (1ms) [Parameters=[@p0='1'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Posts]
WHERE [Id] = @p0;
SELECT @@ROWCOUNT;-- Executed DbCommand (0ms) [Parameters=[@p0='2'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Posts]
WHERE [Id] = @p0;
SELECT @@ROWCOUNT;-- Executed DbCommand (2ms) [Parameters=[@p1='1'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Blogs]
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;
斷開關(guān)系
我們不會刪除博客,而是斷開每篇文章與其博客之間的關(guān)系。 為此,可將每篇文章的引用導(dǎo)航 Post.Blog 設(shè)置為 null:
using var context = new BlogsContext();var blog = context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).First();foreach (var post in blog.Posts)
{post.Blog = null;
}context.SaveChanges();
還可通過從 Blog.Posts 集合導(dǎo)航中刪除每篇文章內(nèi)容來斷開關(guān)系:
using var context = new BlogsContext();var blog = context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).First();blog.Posts.Clear();context.SaveChanges();
無論哪種情況,結(jié)果都一樣:沒有刪除博客,但是刪除了不再與任何博客關(guān)聯(lián)的文章:
-- Executed DbCommand (1ms) [Parameters=[@p0='1'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Posts]
WHERE [Id] = @p0;
SELECT @@ROWCOUNT;-- Executed DbCommand (0ms) [Parameters=[@p0='2'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Posts]
WHERE [Id] = @p0;
SELECT @@ROWCOUNT;
刪除不再與任何主體/依賴實體關(guān)聯(lián)的實體這一行為被稱作“刪除孤立項”。
級聯(lián)刪除和刪除孤立項是密切相關(guān)的。 當(dāng)斷開與所需的主體/父實體之間的關(guān)系時,兩者都將導(dǎo)致刪除依賴實體/子實體。 對于級聯(lián)刪除,由于主體/父實體本身已刪除,因此發(fā)生了這種斷開。 對于孤立項,主體/父實體仍然存在,但不再與依賴實體/子實體相關(guān)。
配置級聯(lián)行為
使用 OnModelCreating 中的 OnDelete 方法按關(guān)系配置級聯(lián)行為。 例如:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().HasOne(e => e.Owner).WithOne(e => e.OwnedBlog).OnDelete(DeleteBehavior.ClientCascade);
}
OnDelete 從公認(rèn)地令人混淆的 DeleteBehavior 枚舉中接受一個值。 該枚舉既定義了 EF Core 在跟蹤實體上的行為,又定義了使用 EF 創(chuàng)建架構(gòu)時數(shù)據(jù)庫中級聯(lián)刪除的配置。
來源
EF更新和插入時如何忽略更新導(dǎo)航屬性
級聯(lián)刪除