我有一个WCF服务,它在我的一个Repository对象中调用以下方法来在数据库中创建一个新的销售对象
public static Sale New(Sale sale)
{
using (var ctx = new DBcontext())
{
ctx.Sales.AddObject(sale);
ctx.SaveChanges();
return sale;
}
}
调用它的WCF方法如下所示
public Sale SaleNew(Sale sale)
{
return SaleRepository.New(sale);
}
当我从客户端应用程序调用它时,我收到以下错误
“底层连接已关闭:连接意外关闭。”
如果我单步执行所有代码似乎运行正常并且记录被引入数据库。如果我在SaveChanges之后将以下行添加到我的存储库方法它可以正常工作
ctx.Detach(sale);
是否发生异常,因为我在方法返回后立即处理上下文?以这种方式使用实体上下文是不好的做法,即直接处理它?我只是这样做,因为它的SOA和几乎无状态,所以我的所有存储库方法创建上下文返回值并处理上下文。传入的任何内容都将被添加到上下文中或重新附加。
答案 0 :(得分:3)
据我所知,我在WCF中开启了跟踪并观察了发生了什么。发生了代理异常。在这种情况下,因为我使用自己的POCO对象,所以我不想要代理对象,所以我将DatabaseContext中的ContextOptions.ProxyCreationEnabled属性设置为false,现在它可以正常工作。
答案 1 :(得分:2)
1)以这种方式使用实体上下文是不好的做法,即直接处理它?</ p>
不,我就是这样做的 - 我相信这是正确的做法。但创建上下文可能昂贵,而对于EF,我们仍然坚持使用没有理想的方式重用上下文。
2)ctx.Detach(sale);
据我所知,对于你正在做的事情不应该被要求,尽管当我重用相同的实体时,我有很多关于附加和分离的问题。 只有在您需要重新附加到上下文时才需要这样做。您使用的是延迟加载吗?