RavenDB跟踪的更改绕过验证
我正在尝试让一个使用RavenDB的应用程序框架运行起来。我已经设置了一个业务逻辑服务,它与会话有1对1的关系,并且有效地成为工作单元抽象 业务逻辑服务的一部分将包含所有验证。服务中的方法可能类似于RavenDB跟踪的更改绕过验证,ravendb,Ravendb,我正在尝试让一个使用RavenDB的应用程序框架运行起来。我已经设置了一个业务逻辑服务,它与会话有1对1的关系,并且有效地成为工作单元抽象 业务逻辑服务的一部分将包含所有验证。服务中的方法可能类似于 public void StoreUser(User user) { //Some validation logic if(string.IsNullOrWhiteSpace(user.Name)) throw new Exce
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
中在每次保存之前,您可以自动执行此类检查
关于这个问题,我写了更多的博客。很好的扩展点,它值得比目前在文档中更多的宣传