简而言之,我有一个管理苹果的WCF服务。除其他功能外,它还有两种从存储中添加和删除苹果的方法。我正在编写一个集成测试,以检查是否有人从这份工作中获得了好处并赢得了苹果。我的WCF服务中的Raven DB具有审核角色,它仅记录动作和Apple。在WCF服务方法中,还有一些其他处理:清洁,验证,包装等。

我的审计集成测试可以表示为


空存储(RavenDB内存模式)
鲍勃来放10个苹果(开放会话,添加,配置会话)
杰克来了,需要4个苹果(开放会话,删除,配置会话)
检查剩下的6个苹果


由于这是两个不同的人(两个WCF调用),因此使用不同的会话实例是有意义的。但是,有了Raven DB,我得到了

例外


Apple未与会话关联,无法删除未知实体
实例


如果我现在运行类似的集成测试,其中两个不同的人只是将苹果添加到存储中,那么存储的总内容就相当于事实。这有点令人困惑:在整个会话中添加作品,而删除则不起作用。 Ayende在this post中表示,无法进行会话微管理,但是对我来说,在集成测试中使用不同的会话似乎很自然。希望与苹果类比不会让您失望。

问题:如何在与RavenDB的集成测试中使用会话?

示例代码(来自记事本)

public void Remove(Apple apple)
{
    using (var session = Store.OpenSession())
    {
        session.Delete(apple);
        session.SaveChanges();
    }
}

public void Add(Apple apple)
{
    using (var session = Store.OpenSession())
    {
        session.Store(apple);
        session.SaveChanges();
    }
}

...

var apples = new apples[10];
//init
MyRavenDB.Add(apples);
MyRavenDB.Remove(apples.Take(4)); //throws here
//verify

最佳答案

在RavenDB中,"The session manages change tracking for all of the entities that it has either loaded or stored"

我怀疑您传递给Apple方法的Remove()引用不是源自RavenDB Document Store,因此出现错误。

试试这个:

public void Remove(Apple apple)
{
    using (var session = Store.OpenSession())
    {
        var entity = session.Load<Apple>(apple.Id);

        session.Delete(entity);
        session.SaveChanges();
    }
}

10-08 05:47