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 を変更した場合は、上記のコードも更新する必要がありました。オブジェクトの ID を計算するために登録された IdConvention を参照する方法はありますかnewUser
。この ID 値を使用すると、ID を自分で作成するのではなく、アイテムが存在するかどうかを確認できます。