私は、RavenDB を使用するアプリケーション フレームワークを動かそうとしています。セッションと 1 対 1 の関係を持ち、効果的に作業単位の抽象化になるビジネス ロジック サービスをセットアップしました。
ビジネス ロジック サービスの一部には、すべての検証が含まれます。サービスからのメソッドは次のようなものかもしれません
public void StoreUser(User user)
{
//Some validation logic
if(string.IsNullOrWhiteSpace(user.Name))
throw new Exception("User name can not be empty");
Session.Store(user);
}
問題は、ユーザーが保存されるとすぐに追跡されるため、store メソッドの検証をバイパスできますが、正しい値を保存して後で変更できることです。
public void TestUserStore()
{
var u1 = new User() {Name = "John"};
var u2 = new User() { Name = "Amy" };
Service.StoreUser(u1);
u1.Name = null; //change is tracked and will persist on the next save changes
Service.StoreUser(u2);
Service.SaveChanges();
//The following fails, as we have stored null as the name rather than "John" bypassing our validation
Assert.IsTrue(Service.AdhocQuery<User>().Any(u => u.Name == "John"));
}
保存されたアイテムのスナップショットのみを保存し、それ以上の変更を追跡しないように RavenDB を取得する方法はありますか? 違法な更新を防ぐために、ビジネス ロジック サービスに出入りするすべてのものを複製する必要がありますか? または、間違った場所で検証を行っていますか?このロジックを配置するより良い場所はありますか?