MongoDB in C#: Mapping IDs
Posted by Kash Farooq on March 4, 2012
In my previous post about C# and MongoDB, I polluted my domain model with a MongoDB type:
public class Movie
{
public BsonObjectId Id { get; set; }
public string Title { get; set; }
public string Year { get; set; }
etc
}
When you Insert a document into MongoDB using the C# driver, the driver needs to check to see if the Id has a value. It assigns one if it doesn’t. The above code worked because I used a MongoDB C# driver ID type – the driver could work out what my ID property is. But I don’t really want to use BsonObjectId in this class – it ties me to MongoDB. Instead, you can use a built-in .NET type for the ID property and tell the MongoDB C# driver about it.
First, let’s change the type of the Id property. I’ve gone for a string but there are other types you could use:
public class Movie
{
public string Id { get; set; }
public string Title { get; set; }
public string Year { get; set; }
etc
}
Now, you need to map that property. I’m doing this code in an NUnit test, so I’m going to do the mapping in the TestFixtureSetUp:
[TestFixtureSetUp]
public void TestFixtureSetUp()
{
BsonClassMap.RegisterClassMap<Movie>(cm => {
cm.AutoMap();
cm.SetIdMember(cm.GetMemberMap(x => x.Id).SetIdGenerator(StringObjectIdGenerator.Instance));
}
);
}
So, I’ve told the MongoDB C# driver that the ID column is Movie.Id and that it needs to use its built in StringObjectIdGenerator to generate IDs.
There are several ID generators built into the driver:
- BsonObjectIdGenerator
- CombGuidGenerator
- GuidGenerator
- NullIdChecker
- ObjectIdGenerator
- StringObjectIdGenerator
- ZeroIdChecker<T>
Read the CSharp Driver Serialization Tutorial for more information about these generators and mapping them to properties.