我正在寻找最有效的方法来更新存储在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;
}
}
我仍然想知道这是否是部分更新文档的最有效方式。