Korte versie:ja, gebruik String overal.
Als je het goed vindt met annotaties, gebruik dan :
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
Anders kunt u een klassenkaart gebruiken:
BsonClassMap.RegisterClassMap<i_YourModel>(cm =>
{
cm.AutoMap();
cm.SetIdMember(cm.GetMemberMap(x => x.Id)
.SetIdGenerator(StringObjectIdGenerator.Instance));
}
);
Lange versie :
Het is aan te raden om zo veel mogelijk (indien mogelijk) iets ondoorzichtigs, dat niet direct verband houdt met de onderliggende database-implementatie, in uw model- en servicelaag te gebruiken.
Voorheen waren primaire-sleutel-ID's meestal grote getallen, die vervolgens werden toegewezen aan een kolom met primaire sleutels in de database. Bij het toewijzen van een nieuwe id aan een nieuwe entiteit moest er echter een controle op de database worden uitgevoerd om er zeker van te zijn dat deze een unieke id had. Er zijn veel technieken, van LO-HI id-generatoren tot auto_increment-kolommen, sequenties enz.
Met NoSQL, en de behoefte aan meer parallellisme, gebruiken de meeste applicaties nu UUID's of variaties daarvan, omdat de ID met redelijke waarschijnlijkheid kan worden gegenereerd, zal deze uniek zijn zonder de database te hoeven vragen of deze echt uniek is, of gebruik te maken van sequenties of dergelijke, dat zijn knelpunten in een applicatie die horizontaal schalen.
MongoDB is geen verschil, en gebruikt ObjectId die een soort UUID's zijn.
Deze id's (zowel mongo als andere) kunnen altijd worden weergegeven als strings, meestal een HEX-representatie van de bytes waaruit de sleutel bestaat. Dus, in uw model, gebruik String als id's, in uw servicelaag hetzelfde, in uw gegevenslaag converteer het naar welk formaat dan ook dat beter is voor uw onderliggende database-implementatie, MongoDB in dit geval.