两个具有相同结构、不同名称、运行时使用的操作方法切换的表
本文关键字:运行时 操作方法 两个 结构 | 更新日期: 2023-09-27 17:56:44
我没有计划这样做,因为需求才刚刚出现,但是使用实体框架,我们有一对表(我称它们为Twins,A和B),具有相同的数据结构但名称不同。这当然是通过 EF 映射为不同类型的对象对。
我想做的是假装我只有一个表/对象,并且在某个地方(也许在存储库中)有一个开关,我可以抛出它来从 B 组表而不是 A 组获取数据。
我无法弄清楚是否有使用存储库的有用路线,使用结构图和/或多态性来使其工作。
另一种选择可能是将孪生"B"表放在第二个数据库中,并且与它们的"A"孪生表同名,如果这会有所帮助的话?
(直到今天,我还以为我有两个不同的数据库,没有交叉,只需要实现一个连接字符串开关 - 事实证明情况并非如此,因为 80% 的表在两个状态之间共享,而它只是 3 或 4 个是孪生的)
我会通过依赖注入和多态性的组合来实现这一点。
与其直接在实体上操作(我们称它们为 TwinA 和 TwinB),我将创建以下类型...
(请原谅这个名字...问题中没有太多上下文信息)
TwinModel (a projected type of the actual entities..hence view model)
然后,你会有...
ITwinRepository
TwinReposotoryImplA
TwinRepositoryImplB
根据需要,正确的存储库将在运行时使用结构映射(通过绑定配置)绑定。 实现差异在于利用一个实体集而不是另一个实体集(TwinA 或 TwinB)。
从编码的角度来看,您仍然针对 ITwinRepository 进行编码并在 TwinModel 上运行,因此,如果您决定实现 TwinC 表,使用者不需要受到未来更改的影响。 :O
我发现创建两个数据库,从第一个生成 EF 对象,然后在第二个中删除公用表并将它们替换为具有相同名称的第一个视图就可以了。然后,这允许我非常简单地在存储库中选取正确的连接字符串(尽管用结构图交换存储库可能会更整洁)。