【发布时间】:2015-02-14 01:21:21
【问题描述】:
我有以下型号:
public class Student
{
public ObjectId Id { get; set; }
public string Name { get; set; }
}
我的控制器中的这个端点:
public IEnumerable<Student> GetAll()
{
MongoCollection<Student> collection = Db.GetCollection<Student>("students");
List<Student> students = collection.AsQueryable().ToList();
return students;
}
向公众公开的 GetAll() 端点返回一个具有 ObjectId 类型的 Id 的 Student,它不是标准类型。我宁愿希望它是字符串类型。
但如果我将其更改为字符串,我将无法使用 .ToList(),出现如下错误:
"Cannot deserialize string from BsonType ObjectId"
我知道我可以使用一些投影和转换来解决这个问题,但是它们会给 CRUD 方法添加一些丑陋和嘈杂的代码。
保持字符串类型中的Id向公众公开并且仍然能够使用c#驱动程序的api的最佳方法是什么?
【问题讨论】:
-
如果要使用字符串而不是ObjectId,也需要直接在Mongo中将类型从ObjectId更改为String。如果您浏览数据,例如使用 MongoVue,您会看到数据类型是 ObjectId。 Id 可以是任何东西(甚至是复杂的对象),但您需要在 DB 和类定义中具有相同的类型。
-
@Pierre-LucPineault:我不敢苟同。您可以注册自定义序列化程序,这很常见。此外,C# 驱动程序带有用于大量类型的内置序列化程序,其中许多类型是 mongo 未知的,包括
decimal、Stack、Dictionary、IPAddress甚至CultureInfo,请参阅 github.com/mongodb/mongo-csharp-driver/tree/master/src/…在数据库中使用字符串会影响性能和存储