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