Гледах хидратацията чрез публикация на конструктора, която се извършва чрез 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);
});