1

假设我们有一个 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。

4

1 回答 1

2

注册 id 约定后,该GenerateDocumentKey方法将使用该约定而不是默认的 hilo 生成方案。

它需要一些参数,如果您首先将IDocumentSession转换为真实的DocumentSession.

var s = ((DocumentSession) session);
var key = s.Conventions.GenerateDocumentKey(s.DatabaseName,
                                            s.DatabaseCommands,
                                            yourEntity);
于 2013-03-31T15:49:57.377 回答