Versione breve:sì, usa String ovunque.
Se sei d'accordo con le annotazioni, usa :
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
Altrimenti puoi usare una mappa di classe :
BsonClassMap.RegisterClassMap<i_YourModel>(cm =>
{
cm.AutoMap();
cm.SetIdMember(cm.GetMemberMap(x => x.Id)
.SetIdGenerator(StringObjectIdGenerator.Instance));
}
);
Versione lunga :
È consigliabile utilizzare qualcosa di opaco, che non sia direttamente collegato all'implementazione del database sottostante, nel modello e nel livello di servizio il più possibile (quando possibile).
In precedenza, gli ID delle chiavi primarie erano in genere grandi numeri, che venivano quindi mappati su una colonna della chiave primaria del numero nel database. Tuttavia, quando si assegna un nuovo ID a una nuova entità, è stato necessario eseguire un controllo sul database per assicurarsi di avere un ID univoco. Esistono molte tecniche, dai generatori di ID LO-HI, alle colonne auto_increment, alle sequenze ecc.
Con NoSQL e la necessità di un maggiore parallelismo, la maggior parte delle applicazioni ora utilizza UUID o varianti di esso, poiché l'ID può essere generato con ragionevoli probabilità che sarà univoco senza dover chiedere al database se è davvero unico, o utilizzare sequenze o simili, che sono colli di bottiglia in un'applicazione che si ridimensiona orizzontalmente.
MongoDB non fa differenza e utilizza ObjectId che sono una sorta di UUID.
Questi ID (sia mongo che altri) possono sempre essere rappresentati come stringhe, di solito una rappresentazione esadecimale dei byte che compongono la chiave. Quindi, nel tuo modello usa String come ID, nel tuo livello di servizio lo stesso, nel tuo livello dati convertilo in qualsiasi formato sia migliore per l'implementazione del tuo database sottostante, MongoDB in questo caso.