代码之家  ›  专栏  ›  技术社区  ›  Alex

RavenDB跟踪的更改绕过验证

  •  13
  • Alex  · 技术社区  · 12 年前

    我正在努力开发一个使用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只存储已存储项目的快照,而不跟踪进一步的更改?我是否应该克隆进出业务逻辑服务的所有内容,以防止非法更新?还是我在错误的地方进行验证?有更好的地方来放置这个逻辑吗?

    1 回复  |  直到 12 年前
        1
  •  12
  •   George Stocker NotMe    12 年前

    将验证逻辑放入 IDocumentStoreListener 在每次保存之前,您可以自动进行这种检查。

    我在博客上写了更多关于这个问题的文章 here