【问题标题】:RavenDB - save or update entity, changed outside the sessionRavenDB - 保存或更新实体,在会话之外更改
【发布时间】:2020-12-22 20:17:25
【问题描述】:

在熟悉 RavenDb 时,我偶然发现了一个重要问题 - 是否可以打开会话、加载文档、然后关闭会话、编辑以前加载的文档、打开另一个会话并更新数据库中的文档?

文档中提供的所有示例仅演示了在单个会话中编辑文档。我也知道补丁操作,但这两种情况都不符合我的要求。

也许有一些类似于 EF 的 SaveOrApdate() 或其他我还不知道的机制?

谢谢。

【问题讨论】:

    标签: ravendb


    【解决方案1】:

    没问题。 您可以打开会话、保存文档和关闭会话。
    之后,您可以打开另一个会话,加载您保存的文档,对其进行编辑,然后再次保存。

    Company newCompany = new Company
    {
        Name = companyName,
        Phone = companyPhone
    };
    
    // Open a session and save a new document
    using (IDocumentSession session = DocumentStoreHolder.Store.OpenSession())
    {
        session.Store(newCompany); 
        // The new document ID is immediately available, save it for later usage                  
        theNewDocumentId = newCompany.Id;                    
        session.SaveChanges();
    }
    
    // Open a session, Load the document, edit & save 
    using (IDocumentSession session = DocumentStoreHolder.Store.OpenSession())
    {
        Company company = session.Load<Company>(theNewDocumentId );                
        company.Name = companyName;                
        session.SaveChanges();
    }
    

    请参阅生成的新文档 ID 的说明:
    https://demo.ravendb.net/demos/csharp/basics/create-document#step-3

    【讨论】:

    • 嗯,这与我描述的场景相同 - 编辑发生在会话内部。我的目标 - 修改与会话外的文档相关联的对象。
    • 您可以使用Put Command 在数据库中插入或更新文档,而无需使用 Session。见ravendb.net/docs/article-page/5.1/csharp/client-api/commands/…
    • 为什么不想使用Session?您可以根据需要使用任意数量。每个会话代表一个业务事务并跟踪您的更改,直到您调用 SaveChanges() 将数据持久化到数据库中。
    • 因为常见的场景是这样的:Web 应用程序从 DB 加载文档,然后通过网络将其发送给客户端。然后客户端可以修改其中一个文档,然后将其发送回服务器以更新数据库中的此文档。一个会话不可能做到这一点,因为加载和更新操作由两种不同的方法表示。 Put Command 看起来确实是一个合理的解决方案,我试试看。
    猜你喜欢
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    相关资源
    最近更新 更多