【发布时间】:2017-02-13 13:48:32
【问题描述】:
我在使用 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;}
}
一个博客有很多帖子。博客有 ICollection 的帖子。博客和帖子之间存在直接的一对多关系。
假设我想从博客中删除所有帖子
当然我可以做到以下几点:
Blog myBlog = ...
var postsToRemove = dbContext.Posts.Where(post => post.BlogId == myBlog.Id);
dbContext.RemoveRange(postsToRemove);
dbContext.SaveChanges();
但是,以下似乎更容易:
Blog myBlog = ...
myBlog.Posts.Clear();
dbContext.SaveChanges();
但是这会导致 InvalidOperationException:
操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
清除收藏的正确方法是什么?对此是否有流畅的 API 语句?
【问题讨论】:
-
据我所知,很遗憾,除了使用 .Remove() 或 .RemoveRange() 之外别无他法。当然,除了通过 EF 直接运行 SQL,但我认为这没有抓住重点。
-
这里描述了您的案例:stackoverflow.com/a/6181060/6804888。似乎在不更改模型的情况下,您必须在将实体从集合中删除后手动删除它们。
标签: c# entity-framework icollection