MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Clé composite MongoDB :InvalidOperationException :{document}. L'identité n'est pas prise en charge

Je regardais l'hydratation via la publication du constructeur qui se fait via GetProperties .

Donc public readonly Sku Sku; n'apparaît pas via classMap.ClassType.GetTypeInfo().GetProperties(_bindingFlags) car il n'est accessible qu'en tant que champ membre.

Vous pouvez le changer en public Sku Sku { get; } il est donc hydraté via le constructeur via GetProperties et modifiez tous les champs en lecture seule (Sku - VendorId, Value &VendorId - Value champs) pour avoir la méthode getter de propriété.

Aussi, vous devez ajouter cm.MapProperty(c => c.Identity) donc x=>x.Identity.Equals(entity.Identity) peut être sérialisé lorsqu'il est utilisé comme expression car Identity ne peut pas être hydraté et enregistré via ImmutablePocoConvention car ce n'est pas un argument de constructeur lorsque la logique de mappage automatique s'exécute.

Changements de code :

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);
});