automatically setting the Id property for subdocuments is missing. Try
public class PhoneBookContact
{
public string Id { get; set; }
public string FirstName { get; set; }
public string Location { get; set; }
public List<string> PhoneBookIds { get; set; }
public List<PhoneBookContactNumber> Numbers { get; set; }
public string ManagerId { get; set; }
public List<string> CategoryIds { get; set; }
}
public class PhoneBookContactNumber
{
public string Id { get; set; }
public string Number { get; set; }
public NumberType Type { get; set; }
}
public enum NumberType
{
Office, Mobile, Home
}
public static void RegisterConventions()
{
var pack = new ConventionPack
{
new IgnoreExtraElementsConvention(true),
new StringObjectIdGeneratorConvention()
};
ConventionRegistry.Register("My Solution Conventions", pack, t => true);
}
internal class StringObjectIdGeneratorConvention : ConventionBase, IPostProcessingConvention
{
public void PostProcess(BsonClassMap cm)
{
var idMemberMap = cm.IdMemberMap;
if (idMemberMap == null || idMemberMap.IdGenerator != null)
return;
if (idMemberMap.MemberType == typeof(string))
{
idMemberMap.SetIdGenerator(StringObjectIdGenerator.Instance)
.SetSerializer(new StringSerializer(BsonType.ObjectId));
}
}
}
public static void ConfigureClassMaps()
{
BsonClassMap.RegisterClassMap<PhoneBookContactNumber>(cm =>
{
cm.AutoMap();
cm.MapIdMember(c => c.Id)
.SetIdGenerator(StringObjectIdGenerator.Instance)
.SetSerializer(new StringSerializer(BsonType.ObjectId));
cm.MapMember(c => c.Number).SetSerializer(new StringSerializer(BsonType.String));
});
BsonClassMap.RegisterClassMap<PhoneBookContact>(cm =>
{
cm.AutoMap();
cm.UnmapMember(m => m.Categories);
cm.UnmapMember(m => m.PhoneBooks);
cm.MapProperty(m => m.NumberOfTelephoneNumbers);
cm.MapProperty(x => x.ManagerId).SetSerializer(new StringSerializer(BsonType.ObjectId));
cm.MapProperty(x => x.PhoneBookIds)
.SetSerializer(new EnumerableInterfaceImplementerSerializer<List<string>, string>(
new StringSerializer(BsonType.ObjectId)));
cm.MapProperty(x => x.CategoryIds)
.SetSerializer(new EnumerableInterfaceImplementerSerializer<List<string>, string>(
new StringSerializer(BsonType.ObjectId)));
cm.MapMember(x => x.Numbers).SetSerializer(
new EnumerableInterfaceImplementerSerializer<List<PhoneBookContactNumber>, PhoneBookContactNumber>(
BsonSerializer.LookupSerializer<PhoneBookContactNumber>()));
});
}