我有一个应用程序,我正在从 RavenDB 1 升级到 RavenDB 2。该应用程序不直接将其域对象存储在数据库中。相反,域对象在持久化之前被转换为文档对象(读取时反之亦然)。例如,域对象:
public class User {
public string Id { get; private set; }
public string Email { get; set; }
public string PasswordSalt { get; private set; }
public string PasswordHash { get; private set; }
public void ChangePassword(string oldPassword, string newPassword) {
...
}
.
.
.
}
以及相应的文档对象(存储在数据库中的内容):
class UserDocument {
public static UserDocument FromEntity(User user) {
...
}
public string Id { get; set; }
public string Email { get; set; }
public string PasswordSalt { get; set; }
public string PasswordHash { get; set; }
public User ToEntity() {
...
}
}
因此,如果我想更改存储在数据库中的用户文档,我通常会加载它,将其转换为相应的域对象,进行更改(例如调用 ChangePassword()),将域对象转换回文档对象并最后调用 IDocumentSession.Store() 和 SaveChanges()。这在 RavenDB 1 中运行良好。
然而,在 RavenDB 2 中,似乎不允许我调用 IDocumentSession.Save() 的实体的 Id 属性设置为采用的 Id。更新文档时,根据定义,将采用 Id 属性。
这个想法似乎是在 RavenDB 2 中我会加载一个对象,更改它,然后调用 SaveChanges() 并且客户端将跟踪已加载的对象并自动将它们发送到服务器。由于我将在代理对象(域对象)中进行所有更改并且不会将原始文档对象留在内存中,因此这对我来说是不可能的。
是否可以将 RavenDB 配置为使用 RavenDB 1 中存在的行为?