我正在开发一个.NET web服务,同时试图维护一个分层架构,使我的模型保持在一个项目中,数据库访问(DAL)保持在另一个项目。这背后的想法是,如果我必须更改DB技术,只需要创建一个不同的DAL,而应用程序的其余部分保持不变。
在我正在开发的数据访问层中,我使用的是Mongo DB C#驱动程序。
我见过:
-
名为"ID"的属性将由C#驱动程序映射为数据库的"_ID"(配置上的约定);
-
MongoDB中的Int+自动增量不是一个好主意;
-
在MongoDB中使用Guid作为ID也不是一个好主意;
-
建议存储在MongoDB中的文档ID的数据类型为
ObjectID
。C#驱动程序提供了一个类来表示这一点;- 但是,如果我在我的模型中使用这种数据类型(来自
MongoDB.Bson
),那么它们将依赖于MongoDB C#驱动程序,我不希望这样:我希望我的模型独立于DB;只有我的DAL可以依赖于我使用的任何数据访问技术
- 但是,如果我在我的模型中使用这种数据类型(来自
那么,为了保证数据库中的唯一性,我应该为POCO的ID使用什么数据类型?就性能而言,Guid的字符串表示会很糟糕吗?
欢迎您的反馈。
好问题。
根据经验,我可以说你是对的:GUID和自动增量都不是最好的主意(GUID比自动增量好得多),但这不仅是因为你链接的SO问题中提到的原因,而且主要是因为你需要意识到单调键与非单调键的含义。
使用ObjectIds
,我看到三个选项:
-
领域模型和DAL之间的映射。在域模型中,可以使用对象的字符串表示。这有点烦人,但它会迫使你分离关注点。
-
使用您自己的数据类型并实现类型转换器/mongodb序列化程序。我还没有试过,但我不明白为什么这不起作用。
-
接受MongoDB依赖关系。毕竟,如果真的交换数据库,那将是一项巨大的任务。不同的数据库具有非常不同的特性,并且需要非常不同的数据模型。一分钟内整个"交换数据库"都是假的IMHO,从来没有那么容易,数据库是一个比任何人都想承认的更容易泄露的抽象概念。试图保持独立是一个PITA。无论如何,对单词
ObjectId
进行查找和销毁将不到其他工作的1%。