C# 使用ICollection';使用实体框架LINQ to Entities的s Remove方法崩溃并关闭连接?

C# 使用ICollection';使用实体框架LINQ to Entities的s Remove方法崩溃并关闭连接?,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,我有以下两个示例实体 public class Document { public int DocumentId { get; set; } public string Title { get; set; } public virtual ICollection<Author> Authors { get; set; } } public class Author { public int AuthorId { get; set; } public string

我有以下两个示例实体

public class Document
{
  public int DocumentId { get; set; }
  public string Title { get; set; }
  public virtual ICollection<Author> Authors { get; set; }
}

public class Author
{
  public int AuthorId { get; set; }
  public string Name { get; set; }
  public virtual Document Document { get; set; }
}
其中,
dbset
是一个
IDbSet
,而
dbcontext
是所有这些事务都发生在其中的
dbcontext

但似乎不起作用的是
ICollection
Remove
方法。
Remove
调用本身返回true,我认为这意味着在内存中删除工作正常。但是失败的是调用
DbContext
SaveChanges
方法。下面的代码将导致
SaveChanges
抛出一个异常,表示需要打开连接,这是我在正常使用EF时从未遇到过的

var document = dbset.ToList().First();
var author = document.Authors.First();
document.Authors.Remove(author);
dbcontext.SaveChanges();
在上面的代码中,
SaveChanges
抛出一个异常,该异常字面上表示“连接必须打开”,即使在它之前我使用连接进行查询也很好。因此,我对这一点的分析是,我的实体类或某些东西导致EF内部的某些东西崩溃,从而关闭了连接,因此我看到了错误,而不是错误的真正原因


有人知道为什么我不能删除这个作者吗?

在我所有首先使用EF代码的项目中,DbSet并没有按照您使用它的方式实例化。我无法复制“崩溃和断开连接”,但我可以抛出一个错误

相反,我建议:

var document = dbContext.dbSet
                .Include(ch => ch.Authors)
                .ToList()
                .FirstOrDefault();

if (document == null) return; 

var author = document.Authors.First();
dbContext.dbSet.Remove(author);
dbContext.SaveChanges();
这是与解决我发现的错误的代码最接近的副本


注意:可能还有更多您尚未提供的信息,这种情况有时会发生;)

只需检查多个活动结果集是否为真。。。 乙二醇



我正在以与您相同的方式创建
DbSet
。考虑到这一点,您的代码的其余部分看起来与我的基本相同。我正在使用Postgres,这不是它的一个特性。
var document = dbContext.dbSet
                .Include(ch => ch.Authors)
                .ToList()
                .FirstOrDefault();

if (document == null) return; 

var author = document.Authors.First();
dbContext.dbSet.Remove(author);
dbContext.SaveChanges();
 <connectionStrings>
 <add name="MyContext" connectionString="Data Source=localhost;Initial Catalog=DBName ;Integrated Security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
 </connectionStrings>