Кратка версия:да, използвайте String навсякъде.
Ако сте добре с анотациите, използвайте :
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
В противен случай можете да използвате карта на класове :
BsonClassMap.RegisterClassMap<i_YourModel>(cm =>
{
cm.AutoMap();
cm.SetIdMember(cm.GetMemberMap(x => x.Id)
.SetIdGenerator(StringObjectIdGenerator.Instance));
}
);
Дълга версия :
Препоръчително е да използвате нещо непрозрачно, което не е пряко свързано с основната реализация на базата данни, във вашия модел и слой на услугата, доколкото е възможно (когато е възможно).
Преди идентификационните номера на първичния ключ обикновено бяха големи числа, които след това бяха нанесени към колона с числов първичен ключ в базата данни. Въпреки това, когато се присвоява нов идентификатор на нов обект, трябва да се направи проверка на базата данни, за да се гарантира, че има уникален идентификатор. Съществуват много техники, от LO-HI id генератори, до auto_increment колони, до последователности и т.н.
С NoSQL и необходимостта от повече паралелизъм повечето приложения вече използват UUID или негови вариации, тъй като идентификаторът може да бъде генериран с разумни вероятности, че ще бъде уникален, без да се налага да питате базата данни дали е наистина уникален или да използвате последователности или подобни, които са тесни места в приложение, което се мащабира хоризонтално.
MongoDB няма разлика и използва ObjectId, който е вид UUID.
Тези идентификатори (монго и други) винаги могат да бъдат представени като низове, обикновено HEX представяне на байтовете, съставящи ключа. И така, във вашия модел използвайте String като идентификатори, във вашия сервизен слой същото, във вашия слой данни го преобразувайте във всеки формат, който е по-добър за вашата основна реализация на база данни, MongoDB в този случай.