Har*_*lse 6 c# entity-framework icollection
我在使用Clear()从实体框架中的集合中删除所有元素时遇到问题
考虑一下常用的博客和帖子示例.
public class Blog
{
public int Id {get; set;}
public string Name {get; set;}
public virtual ICollection<Post> Posts { get; set; }
}
public class Post
{
public int Id { get; set; }
// foreign key to Blog:
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
public string Title { get; set; }
public string Text { get; set; }
}
public class BlogContext : DbContext
{
public DbSet<Blog> Blogs {get; set;}
public DbSet<Post> Posts {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
博客有很多帖子.博客有一个ICollection的帖子.博客和帖子之间存在直接的一对多关系.
假设我想从博客中删除所有帖子
我当然可以做以下事情:
Blog myBlog = ...
var postsToRemove = dbContext.Posts.Where(post => post.BlogId == myBlog.Id);
dbContext.RemoveRange(postsToRemove);
dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
但是,以下似乎更容易:
Blog myBlog = ...
myBlog.Posts.Clear();
dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
但是,这会导致InvalidOperationException:
操作失败:无法更改关系,因为一个或多个外键属性不可为空.当对关系进行更改时,相关的外键属性将设置为空值.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象.
清除收藏品的正确方法是什么?有一个流畅的API声明吗?
Clear 适用于关系而不是删除实体。
您编写的两个解决方案之间有一个有效的(我认为更具可读性)中途解决方案。
dbContext.Posts.RemoveRange(myBlog.Posts);
// Now (also before SaveChanges) the myBlog.Posts is empty
dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
EDIT
RemoveRange还会从Blog.Posts集合中删除 Posts
两个代码示例之间存在差异.
您的第一个代码示例dbContext.RemoveRange(postsToRemove)删除了Post记录.因此,也删除了涉及这些记录的任何关系.
在第二个代码示例中,myBlog.Posts.Clear()您将删除它们myBlog与其相应Post记录之间的关系."真正的"基础操作是BlogId将Post记录的值设置为null.不幸的是,这是不可能的,因为BlogId设置为不可空.因此,简而言之,关系将被删除,并且实际上不会删除任何记录.
| 归档时间: |
|
| 查看次数: |
8336 次 |
| 最近记录: |