Я играю вокруг, пытаясь получить структуру приложения, использующую 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);
}
Проблема в том, что, поскольку пользователь отслеживается, как только он хранится, я могу обойти любую проверку на методе хранилища, но сохраняя правильное значение, а затем меняя его позже
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 хранить только моментальный снимок сохраненного элемента и не отслеживать дальнейшие изменения? Должен ли я клонировать все, что входит в и из службы бизнес-логики, чтобы предотвратить незаконное обновление? или я делаю проверку в неправильном месте, есть ли лучшее место, чтобы поставить эту логику?