Подтвердить что ты не робот

Отслеживаемые изменения RavenDB обходят проверку

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

4b9b3361

Ответ 1

Поместите свою логику проверки внутри IDocumentStoreListener перед каждым сохранением, вы можете выполнить эту проверку автоматически.

Я больше писал об этом вопросе здесь.