【问题标题】:Getting IdConvention in RavenDB在 RavenDB 中获取 IdConvention
【发布时间】:2013-03-31 23:49:57
【问题描述】:

假设我们有一个用户类

    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。

【问题讨论】:

    标签: c# linq ravendb ravendb-studio


    【解决方案1】:

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

    它需要一些参数,如果您首先将IDocumentSession 转换为真正的DocumentSession,则最容易获得这些参数。

    var s = ((DocumentSession) session);
    var key = s.Conventions.GenerateDocumentKey(s.DatabaseName,
                                                s.DatabaseCommands,
                                                yourEntity);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多