开发者

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 s开发者_开发知识库ub-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?


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.


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜