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>