RavenDB: Id Generation For Sub-Documents
Asked Answered
L

2

13

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?

Lamarlamarck answered 2/7, 2010 at 15:18 Comment(0)
C
14

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.

Croat answered 7/7, 2010 at 21:47 Comment(1)
Thanks Matt. That describes my situation exactly. I'll up-vote your answer once I have enough reputation.Lamarlamarck
M
8

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.

Made answered 7/1, 2011 at 5:40 Comment(1)
Note that this is now Session.Advanced.DocumentStore.Conventions.GenerateDocumentKey(sc)Monosyllabic

© 2022 - 2024 — McMap. All rights reserved.