13
我在玩弄試圖獲取使用RavenDB的應用程序框架。我已經建立了一個業務邏輯服務,它與會話具有1對1的關係,並且有效地成爲工作抽象的單元。RavenDB跟蹤更改繞過驗證
業務邏輯服務的一部分將包含所有驗證。從服務的方法可能是這樣的
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只存儲保存該項目的一個快照,而不是跟蹤進一步的變化?我是否應該克隆進出業務邏輯服務的所有內容以防止非法更新?或者我在錯誤的地方做驗證是否有更好的地方來放置這個邏輯?
偉大的擴展點,它應該比目前對文檔有更多的宣傳 – Alex
感謝您的回覆。 –