Fork me on GitHub





Getting Started Edit on GitHub

First, go get the Marten library from Nuget:

PM> Install-Package Marten

Or, using paket:

paket add nuget Marten

The next step is to get access to a Postgresql 9.5+ database schema. If you want to let Marten build database schema objects on the fly at development time, make sure that your user account has rights to execute CREATE TABLE/FUNCTION statements.

Marten uses the Npgsql library to access Postgresql from .Net, so you'll likely want to read their documentation on connection string syntax.

Bootstrapping a Document Store

To start up Marten in a running application, you need to create a single IDocumentStore object. The quickest way is to start with all the default behavior and a connection string:

var store = DocumentStore

Now, for your first document type, let's represent the users in our system:

public class User
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool Internal { get; set; }
    public string UserName { get; set; }

For more information on document id's, see Document Identity.

And now that we've got a Postgresql schema and an IDocumentStore, let's start persisting and loading user documents:

// Open a session for querying, loading, and 
// updating documents 
using (var session = store.LightweightSession())
    var user = new User {FirstName = "Han", LastName = "Solo"};


// Open a session for querying, loading, and 
// updating documents with a backing "Identity Map"
using (var session = store.OpenSession())
    var existing = session
        .Where(x => x.FirstName == "Han" && x.LastName == "Solo")

// Open a session for querying, loading, and 
// updating documents that performas automated
// "dirty" checking of previously loaded documents
using (var session = store.DirtyTrackedSession())

Integrating Marten with IoC Containers

The Marten team has striven to make the library perfectly usable without the usage of an IoC container, but you may still want to use an IoC container specifically to manage dependencies and the lifecyle of Marten objects.

Using StructureMap as the example container, we recommend registering Marten something like this:

public class MartenServices : Registry
    public MartenServices()
        ForSingletonOf<IDocumentStore>().Use("Build the DocumentStore", () =>
            return DocumentStore.For(_ =>
                _.Connection("your connection string");
                _.AutoCreateSchemaObjects = AutoCreate.None;
                // other Marten configuration options

            .LifecycleIs<ContainerLifecycle>() // not really necessary in some frameworks
            .Use("Lightweight Session", c => c.GetInstance<IDocumentStore>().LightweightSession());

There are really only two key points here:

  1. There should only be one IDocumentStore object instance created in your application, so I scoped it as a "Singleton" in the StructureMap container
  2. The IDocumentSession service that you use to read and write documents should be scoped as "one per transaction." In typical usage, this ends up meaning that an IDocumentSession should be scoped to a single HTTP request in web applications or a single message being handled in service bus applications.

There's a lot more capabilities than what we're showing here, so head on over to Documentation to see what else Marten offers.