.NET,分层架构和MongoDB - 什么用作ID?

时间:2014-02-12 11:42:39

标签: c# asp.net mongodb mongodb-.net-driver

我正在开发一个.NET Web服务,同时尝试维护一个分层架构,使我的模型在一个项目中保存,而DB访问(DAL)在另一个项目中。这背后的想法是,如果我必须更改数据库技术,那只需要创建一个不同的DAL,而应用程序的其余部分保持不变。

在我正在开发的数据访问层中,我正在使用Mongo DB C# Driver

我见过:

  • 名为“ID”的属性将由C#驱动程序映射为数据库的“_id”(约定优于配置);

  • Into + MongoDB中的自动增量is not a good idea;

  • 在MongoDB中使用Guid作为ID isn't a good idea either;

  • MongoDB中存储的文档ID的推荐数据类型为ObjectID。 C#驱动程序提供了一个表示它的类;

    • 但是,如果我在模型中使用此数据类型(来自MongoDB.Bson),那么它们将依赖于MongoDB C#驱动程序而我不希望这样:我希望我的模型与数据库无关;只有我的DAL可以依赖于我使用的任何数据访问技术。

那么我应该将哪种数据类型用于我的POCO ID以保证数据库中的唯一性? Guid的字符串表示在性能方面是否可怕?

欢迎您的反馈。

1 个答案:

答案 0 :(得分:6)

好问题。

根据经验,我可以说你是对的:GUID和自动增量都不是最好的主意(GUID比自动增量好很多),但不仅仅是因为SO中提到的原因你联系的问题,但主要是因为你需要了解单调与非单调键的含义。

使用ObjectIds,我看到三个选项:

  • 域模型和DAL之间的映射。在域模型中,您可以使用objectid的字符串表示。这有点令人讨厌,但它迫使你分离关注点。

  • 使用您自己的数据类型并实现类型转换器/ mongodb序列化程序。我没有尝试过,但我不明白为什么这不起作用。

  • 接受MongoDB依赖项。毕竟,如果真的交换了数据库,那将是 巨大的 任务。不同的数据库具有非常不同的特征,并且需要非常不同的数在一分钟内整个“交换数据库”是虚假的恕我直言,它从来没有那么容易,数据库是一个比任何人都想承认的更漏洞的抽象。试图保持独立是PITA。无论如何,对单词ObjectId进行搜索和销毁将不到其他工作的1%。