如何部分更新Marten ORM文档

时间:2018-02-25 01:03:21

标签: c# postgresql marten

我正在寻找最有效的方法来更新存储在Postgres数据库(V 10)中的现有Marten文档中的单个属性。例如,假设User定义为:

public class User(){

    public string Id {get; set;}
    public string Name {get; set;}
    public int Age {get; set;}

}

我有一个用户保存在用户数据库中,Id:1,名称:Joe,年龄:30。然后我想将Name的值更新为Joe Smith,我可以:

查询文档的服务器,更新文档并再次保存:

DocumentStore store = // omitted for brevity
User user;

// Get User Document
using (var session = store.OpenSession())
            {
                user = session
                    .Query<User>()
                    .Where(x => x.Id == 1)
                    .FirstOrDefault();
            }

// Update user name
user.Name = "Joe Smith";

using (var session = store.LightweightSession())
            {
                session.Store(user);
                session.SaveChanges();
            }

但由于两个交易,一个用于查询,一个用于保存,这看起来非常低效。

我使用Session.Patch从2015年发现Jeremy Miller's discussion并实施了此类更新。我不得不为Postgres安装plv8 extension,因为他们似乎已经停止从之前的几个版本中包含它。我有自己的方法执行:

private void UpdateUserName(string userId, string newName, DocumentStore store)
        {
            try
            {

                using (var session = store.OpenSession())
                {
                    Guid userGuid = new Guid(userId);
                    session.Patch<User>(userGuid).Set(u => u.Name, newName );
                }
            }
            catch
            {
                throw;
            }
        }

执行此操作时不会抛出任何异常,但不会影响对数据库中保存的用户文档的更改。

我不确定我的修补程序中是否有错误,或者是否只是使用不需要plv8的其他会话方法更好的方法延期。

更新:已解决的修补程序在修补程序调用之后添加SaveChanges()调用,不会影响对数据库的更改,如下所示:

private void UpdateUserName(string userId, string newName, DocumentStore store)
        {
            try
            {

                using (var session = store.OpenSession())
                {
                    Guid userGuid = new Guid(userId);
                    session.Patch<User>(userGuid).Set(u => u.Name, newName );
                    session.SaveChanges(); // <-- force changes to database
                }
            }
            catch
            {
                throw;
            }
        }

我仍然想知道这是否是部分更新文档的最有效方式。

0 个答案:

没有答案