实体框架和WCF(返回附加到上下文的实体)

时间:2010-12-06 12:03:45

标签: wcf entity-framework

我有一个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和几乎无状态,所以我的所有存储库方法创建上下文返回值并处理上下文。传入的任何内容都将被添加到上下文中或重新附加。

2 个答案:

答案 0 :(得分:3)

据我所知,我在WCF中开启了跟踪并观察了发生了什么。发生了代理异常。在这种情况下,因为我使用自己的POCO对象,所以我不想要代理对象,所以我将DatabaseContext中的ContextOptions.ProxyCreationEnabled属性设置为false,现在它可以正常工作。

答案 1 :(得分:2)

1)以这种方式使用实体上下文是不好的做法,即直接处理它?<​​/ p>

不,我就是这样做的 - 我相信这是正确的做法。但创建上下文可能昂贵,而对于EF,我们仍然坚持使用没有理想的方式重用上下文。

2)ctx.Detach(sale);

据我所知,对于你正在做的事情不应该被要求,尽管当我重用相同的实体时,我有很多关于附加和分离的问题。 只有在您需要重新附加到上下文时才需要这样做。您使用的是延迟加载吗?