Eu estava olhando para a hidratação via post do construtor que é feito através de
GetProperties
. Então
public readonly Sku Sku;
não aparece por meio de classMap.ClassType.GetTypeInfo().GetProperties(_bindingFlags)
porque só pode ser acessado como campo de membro. Você pode alterá-lo para
public Sku Sku { get; }
então é hidratado através do construtor via GetProperties
e altere todos os campos somente leitura (Sku - VendorId, Value
&VendorId - Value
campos) para ter o método getter de propriedade. Além disso, você deve adicionar
cm.MapProperty(c => c.Identity)
então x=>x.Identity.Equals(entity.Identity)
pode ser serializado quando usado como expressão porque Identity
não pode ser hidratado e registrado através do ImmutablePocoConvention
pois não é um argumento construtor quando a lógica de automap é executada. Alterações de código:
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);
});