I'm trying migrating an existing web application to use RavenDB.
I currently have pages in my web application which allow you to view Categories, SubCategories and Resources based on an id in the querystring.
However I notice that RavenDB generates ids for aggregate roots, but not for child entities.
I don't think subcategory is an aggregate root (a Category has SubCategories), so am making it a sub-document of my Category document.
Am I wrong to make it a sub-document as I'm accessing it directly by its id passed in on the querystring? But if not, how should I access individual SubCategories as RavenDB does not seem to generate ids for entities that are not aggregate roots?
I ran into this problem but wasn't comfortable with letting the documents generate the ID's as I didn't feel it was thread safe, particularly for web based environments.
Eventually I decided to let the server generate the id's for me using a the GenerateDocumentKey method like so:
using (var session = Store.OpenSession())
{
if(category.SubCategories != null)
{
var newSubCategories = data.BankAccounts.Where(x => string.IsNullOrEmpty(x.Id));
foreach (var sc in newSubCategories)
sc.Id = session.Advanced.Conventions.GenerateDocumentKey(sc);
}
session.Store(data);
session.SaveChanges();
}
This way I'm allowing the database to generate the child Id's and can ensure that I won't have to cater for race conditions etc in the actual class itself.
There's a long but interesting discussion over on the Raven mailing list about this exact situation.
The short answer is that Raven isn't designed to do this, only root entities get an id, everything else is treated as a value type. But you can implement it yourself, see the code sample at the end of the thread for info.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With