Гледах хидратацията чрез публикация на конструктора, която се извършва чрез GetProperties .
Така че public readonly Sku Sku; не се показва чрез classMap.ClassType.GetTypeInfo().GetProperties(_bindingFlags) защото може да бъде достъпен само като поле за член.
Можете да го промените на public Sku Sku { get; } така че се хидратира чрез конструктор чрез GetProperties и променете всички полета само за четене (Sku - VendorId, Value &VendorId - Value полета), за да има метод за получаване на свойства.
Освен това трябва да добавите cm.MapProperty(c => c.Identity) така че x=>x.Identity.Equals(entity.Identity) може да се сериализира, когато се използва като израз, защото Identity не може да се хидратира и регистрира чрез ImmutablePocoConvention тъй като не е аргумент на конструктор, когато се изпълнява логиката на автоматичното съпоставяне.
Промени в кода:
public class Sku : Identity<Product>
{
public VendorId VendorId { get; }
public string Value { get; }
}
public class VendorId : Identity<Vendor>
{
public string Value { get; }
}
BsonClassMap.RegisterClassMap<Product>(cm =>
{
cm.AutoMap();
cm.MapIdMember(c => c.Sku);
cm.MapProperty(c => c.Identity);
});