假设我们有一个 User 类
public class User
{
public User() {
Created = DateTime.Now;
Tags = new List<string>();
}
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime Created {get;set;}
public IEnumerable<string> Tags {get; private set;}
}
并且可能希望用户拥有像 [FirstName]/[LastName] 这样的 id,所以我们像这样注册一个 IdConvention:
_documentStore
.Conventions
.RegisterIdConvention<User>(
(dbname, commands, user) => user.FirstName +"/" + user.LastName ));
现在假设您创建了一个附加了一组新标签的新用户。如果用户不存在,您希望将其存储在 RavenDB 中。但是,如果用户确实存在,您不想覆盖现有对象,因为您想保留初始Created
日期。因此,您只需Tags
使用新创建的用户的值更新枚举。
你可能会做这样的事情:
public void AddOrUpdateUser(User newUser) {
using (var session = _documentStore.OpenSession())
{
var existingUser = session.Load<User>("myFirstname/myLastname")
if(user != null) {
existingUser.Tags = user.Tags;
}
else {
session.Store(newUser);
}
session.SaveChanges();
}
}
但是,如果由于某种原因我更改了 IdConvention,我也必须更新上面的代码。有没有办法引用注册的 IdConvention 来计算newUser
对象的 id。使用此 id 值,您可以检查项目是否存在,而不是自己创建 Id。