【发布时间】: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