使用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
。
我使用的是实体框架的代码优先方法。我使用DbContext
fluent API来手动指定模式绑定细节(而不是数据注释(。现在,我完全可以使用ICollection
的Add
方法创建一个新的Author
,如下所示。。。
var document = dbset.ToList().First();
document.Authors.Add(new Author { ... });
dbcontext.SaveChanges();
其中,dbset
是IDbSet<Document>
,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 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>