在我的数据库设计中,我倾向于使用表的“集群”。这些集群通常会支持一个应用程序或一组功能紧密相关的应用程序。通常,这些集群还通过相对较少数量的外键相互关联;这有助于业务中原本独立的应用程序相互集成。
因此,例如:假设我有应用程序“Foo”、“Bar”和“Baz”,每个应用程序都有几个表。这是表及其外键引用的列表:
- FooTableOne
- FooTableTwo -> FooTableOne
- BarTableOne -> FooTableTwo
- BarTableTwo -> BarTableone
- BazTableOne
- BazTableTwo -> FooTableTwo,BazTableOne
目前,我正在使用 LINQ-to-SQL 来访问这些表。我为每个集群(Foo、Bar 和 Baz)都有一个单独的项目,并且每个项目都有一个用于集群中所有表的 .dbml。这里的想法是,使用集群的每个(一个或多个)应用程序都可以导入一个包含它需要的 LINQ 类的共享库。
这可能是一个好主意,也可能不是一个好主意;看起来陪审团 还 没有 出来。我真正想知道的是,我是否可以拥有由另一个集群中的类表示的集群之间的引用,即使它们存在于不同的上下文类中。(更具体地说,如何在 Visual Studio 中创建这种关系)。
回到这个例子,我想要:
- 富项目
- Foo.dbml
- FooDataContext
- FooTableOne
- FooTableOne.FooTableTwos
- FooTableTwo
- FooTableTwo.FooTableOne
- FooTableTwo.BarTableOnes(这个没那么重要)
- FooTableTwo.BazTableTwos(这个没那么重要)
- 项目栏
- 条形图.dbml
- 条形数据上下文
- 吧台一号
- BarTableOne.FooTableTwo
- BarTableOne.BarTableTwos
- 酒吧桌二
- BarTableTwo.BarTableOne
- 巴兹计划
- Baz.dbml
- BazDataContext
- BazTableOne
- BazTableOne.BazTableTwos
- BazTableTwo
- BazTableTwo.FooTableTwo
- BazTableTwo.BazTableOne
在门外,对上下文外实体的所有引用都是简单的 ID(整数),而不是对象,而且对上下文外实体的集合根本不存在。我知道我可以将自己的方法添加到这些类中以进行适当的查找(给定上下文的实例),但我想让事情变得更加精简和一致。
请注意,通过上下文/集群的这种分离,我获得了应用程序之间的模块化。因此,例如,Baz 应用程序只需导入 Baz 和 Foo 上下文(因为 Baz 依赖于 Foo),而不是 Bar。(这假设我在 Foo 中没有 Bar 实体的集合,这对我来说很好)。这是一件好事,但并不重要:如果 LINQ/VS 不能让这变得容易,那么我将考虑放弃模块化并使用单一上下文。