RavenDB跟踪更改绕过验证

Ale*_*lex 13 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);
    }
Run Code Online (Sandbox Code Playgroud)

问题在于,因为用户一旦被存储就会被跟踪,我可以绕过存储方法的任何验证但是存储正确的值然后稍后更改它

    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"));

    }
Run Code Online (Sandbox Code Playgroud)

有没有办法让RavenDB只存储存储的项目的快照而不跟踪进一步的更改?我是否应该克隆进出业务逻辑服务的所有内容以防止非法更新?或者我在错误的地方进行验证是否有更好的地方放置这个逻辑?

Aye*_*ien 12

IDocumentStoreListener在每次保存之前将验证逻辑放入其中,您可以自动执行此类检查.

我在这里写了更多关于这个问题的博文.

  • 伟大的延伸点,它应该比目前的文档更多的宣传 (4认同)