Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RavenDB: Id Generation For Sub-Documents

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?

like image 711
Andy Avatar asked Jul 02 '10 15:07

Andy


2 Answers

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.

like image 187
lomaxx Avatar answered Oct 06 '22 03:10

lomaxx


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.

like image 39
Matt Warren Avatar answered Oct 06 '22 02:10

Matt Warren