用于 WCF 和集成测试的 RavenDb 会话管理

发布于 2025-01-01 14:12:53 字数 1283 浏览 1 评论 0原文

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

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

  • 空存储(RavenDB内存模式)
  • Bob来并放入10个苹果(打开会话,添加,处置会话) )
  • Jake 过来拿了 4 个苹果(打开会话、删除、处置会话)
  • 检查是否还剩下 6 个苹果

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

异常

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

如果我现在运行类似的集成测试,其中两个不同的人只是将苹果添加到存储中,则总存储内容对应于事实。这是令人困惑的一点:跨会话添加有效,删除无效。在这篇文章中,Ayende 表示会话微观管理不是这是可行的方法,但对我来说,在集成测试中使用不同的会话似乎很自然。希望与苹果的类比不会让你失望。

问题:如何在 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

Put simply, I have a WCF service that manages apples. Apart from other functionality, it has two methods to add and remove apples from storage. I am writing an integration test to check if someone is getting advantage of the job and nicks apples. Raven DB in my WCF service has an audit role, it just records actions and apples. In the methods of WCF service there is some other processing: cleaning, validation, packaging etc.

My audit integration test can be expresses as

  • Empty storage (RavenDB in-memory mode)
  • Bob comes and puts 10 apple (open session, add, dispose session)
  • Jake comes and takes 4 apples (open session, remove, dispose session)
  • Check that 6 apples left

As these are two different people (two WCF calls) it make sense to use different instances of session. However, with Raven DB I get

Exception

Apple is not associated with the session, cannot delete unknown entity
instance

If I now run similar integration test where two different people just add apples to the storage, the total storage content corresponds to truth. This is confusing bit: adding works across session, removing doesn't work. In this post Ayende says session micro-managing is not the way to go, but it seems natural to me to use different sessions in my integration testing. Hope analogy with apples doesn't put you off.

Question: How do I use sessions in integration testing with RavenDB?

Sample code (from notepad)

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

比忠 2025-01-08 14:12:53

在 RavenDB 中,"会话管理其拥有的所有实体的更改跟踪加载或存储”

我怀疑您传递给 Remove() 方法的 Apple 引用并非源自 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();      
    }
}

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

I suspect the Apple reference you are passing to Remove() method, did not originate from RavenDB Document Store, hence the error.

Try this:

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

        session.Delete(entity);
        session.SaveChanges();      
    }
}
能怎样 2025-01-08 14:12:53

您通过网络传递实体,这通常是一个很大的禁忌。
这样做:

 public void Remove(string appleId)

这会给你更好的语义。

You are passing entities over the wire, and that is generally a big no-no.
Do it like this:

 public void Remove(string appleId)

That would give you much better sematnics.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文