使用ICollection';s Remove方法,使用实体框架LINQ to实体,崩溃并关闭连接

本文关键字:实体 框架 LINQ to 连接 崩溃 ICollection 使用 方法 Remove | 更新日期: 2023-09-27 18:04:14

我有以下两个示例实体。。。

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; }
}

探测到这一点,一个Document可以有多个Authors

我使用的是实体框架的代码优先方法。我使用DbContextfluent API来手动指定模式绑定细节(而不是数据注释(。现在,我完全可以使用ICollectionAdd方法创建一个新的Author,如下所示。。。

var document = dbset.ToList().First();
document.Authors.Add(new Author { ... });
dbcontext.SaveChanges();

其中,dbsetIDbSet<Document>dbcontext是所有这些事务都发生在其中的DbContext

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

var document = dbset.ToList().First();
var author = document.Authors.First();
document.Authors.Remove(author);
dbcontext.SaveChanges();

在上面的代码中,SaveChanges抛出了一个异常,它实际上表示"必须打开连接",尽管在此之前我使用连接进行了查询。因此,我对此的分析是,我的实体类或某些东西导致EF内部的某些东西崩溃,从而关闭了连接,因此我看到了错误,而不是错误的真正原因。

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

使用ICollection';s Remove方法,使用实体框架LINQ to实体,崩溃并关闭连接

在我所有使用EF Code First的项目中,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();

这是与解决我发现的错误的代码最接近的副本。

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

只是检查多个活动结果集是否为true。。。例如

 <connectionStrings>
 <add name="MyContext" connectionString="Data Source=localhost;Initial Catalog=DBName ;Integrated Security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
 </connectionStrings>