RavenDB跟踪的更改绕过验证

RavenDB跟踪的更改绕过验证,ravendb,Ravendb,我正在尝试让一个使用RavenDB的应用程序框架运行起来。我已经设置了一个业务逻辑服务,它与会话有1对1的关系,并且有效地成为工作单元抽象 业务逻辑服务的一部分将包含所有验证。服务中的方法可能类似于 public void StoreUser(User user) { //Some validation logic if(string.IsNullOrWhiteSpace(user.Name)) throw new Exce

我正在尝试让一个使用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"));

    }
public void TestUserStore()
{
var u1=新用户(){Name=“John”};
var u2=新用户(){Name=“Amy”};
服务。商店用户(u1);
u1.Name=null;//跟踪更改,并将在下次保存更改时保持不变
服务商店用户(u2);
SaveChanges();
//以下操作失败,因为我们将null存储为名称,而不是绕过验证的“John”
Assert.IsTrue(Service.AdhocQuery().Any(u=>u.Name==“John”);
}

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

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


关于这个问题,我写了更多的博客。

很好的扩展点,它值得比目前在文档中更多的宣传