c# - MongoDB ObjectIds 曝光

标签 c# mongodb

我有一个数据层(包含与 MongoDB 的连接)、一个域层(包含存储库和实体)和一个服务层(包含服务和模型)

现在因为我的实体使用 ObjectId,它们需要 MongoDB 的知识(这样可以吗?)

我的服务 get 调用返回这些实体的存储库,然后将它们转换为模型。由于实体上的 ObjectId 属性,这导致我的服务层需要了解 MongoDB。

有什么办法可以避免这种情况吗?我听说我可以将我的 Id 用作类型字符串,并且在存储数据时 MongoDB 会将其转换为 ObjectId?

最佳答案

简短版本:是的,到处都使用 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));
 }
);

长版:

建议在您的模型和服务层中尽可能多地(如果可能)使用不透明的、不直接连接到底层数据库实现的东西。

以前,主键 ID 通常是大数字,然后映射到数据库中的数字主键列。但是,在为新实体分配新 ID 时,必须对数据库进行检查以确保具有唯一 ID。存在许多技术,从 LO-HI id 生成器到 auto_increment 列,再到序列等。

使用 NoSQL 以及对更多并行性的需求,大多数应用程序现在都使用 UUID 或其变体,因为可以以合理的概率生成 ID,它是唯一的,而无需询问数据库它是否真的唯一,或者使用序列等,它们是水平扩展应用程序中的瓶颈。

MongoDB也不异常(exception),使用的是UUID的一种ObjectId。

这些 id(包括 mongo 和其他)总是可以表示为字符串,通常是组成 key 的字节的十六进制表示。因此,在您的模型中使用字符串作为 ID,在您的服务层中使用相同的方式,在您的数据层中将其转换为任何更适合您的底层数据库实现的格式,在本例中为 MongoDB。

关于c# - MongoDB ObjectIds 曝光,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25936621/

相关文章:

c# - 关于 DataType 如何工作,是否有很好的数据注释引用?

c# - 从 Azure 存储下载部分文件

c++ - mongocxx::instance inst{} 内存泄漏;

node.js - Mongoose - 如何指定和删除依赖关系?

node.js - Node js 和 mongoDB - TypeError : db. 集合不是函数

c# - 使用 C# 下载 Twilio 录音

c# - 警告 MSB3270 架构不匹配/AL1073 针对不同的处理器

python - 返回集合中 ISODate 值的最小值

java - 当我想以毫秒为单位获取 unix 时间时,Mongodb 时间戳输出格式返回 "$numberLong"对象

c# - 使用 Func 捕获类属性