C# 两个具有相同结构、不同名称的表,如何在运行时切换

C# 两个具有相同结构、不同名称的表,如何在运行时切换,c#,entity-framework,entity-framework-4,structuremap,C#,Entity Framework,Entity Framework 4,Structuremap,我没有计划这样做,因为需求刚刚出现,但使用实体框架,我们有两对表(我称它们为Twins,A&B),它们具有相同的数据结构,但名称不同。当然,这通过EF映射为不同类型的对象对 我想做的是假设我只有一个表/对象,并且在某个地方(可能在存储库中)有一个开关,我可以抛出它来从B组表而不是a组表中获取数据 我不知道是否有一个有用的路由使用repo,使用structuremap和/或多态性来实现这一点 另一种选择可能是将这两个“B”表放在第二个数据库中,并与它们的“a”表同名,如果这样做有帮助的话 (直到今

我没有计划这样做,因为需求刚刚出现,但使用实体框架,我们有两对表(我称它们为Twins,A&B),它们具有相同的数据结构,但名称不同。当然,这通过EF映射为不同类型的对象对

我想做的是假设我只有一个表/对象,并且在某个地方(可能在存储库中)有一个开关,我可以抛出它来从B组表而不是a组表中获取数据

我不知道是否有一个有用的路由使用repo,使用structuremap和/或多态性来实现这一点

另一种选择可能是将这两个“B”表放在第二个数据库中,并与它们的“a”表同名,如果这样做有帮助的话


(直到今天,我还以为我有两个不同的数据库,没有交叉,只需要实现一个连接字符串开关——结果不是这样,因为80%的表在两个州之间共享,而只是3或4个成对的表)

我将通过依赖注入和多态性的组合来实现这一点

我将创建以下类型,而不是直接在实体上操作(我们称它们为TwinA和TwinB)

(请原谅这个名字……问题中没有太多上下文信息)

那么,你会

ITwinRepository
TwinReposotoryImplA
TwinRepositoryImplB
根据需要,将在运行时使用结构映射(通过绑定配置)绑定正确的存储库。实现的不同之处在于利用一个实体集而不是另一个实体集(TwinA或TwinB)


从编码的角度来看,您仍然在根据ITwinRepository进行编码,并在TwinModel上运行,因此,如果您决定实施TwinC表,消费者将不需要受到未来更改的影响O

我发现创建两个数据库,从第一个数据库生成EF对象,然后在第二个数据库中删除常用表,并将它们替换为具有相同名称的视图返回第一个数据库,效果很好。这样,我就可以非常简单地在存储库中选择正确的连接字符串(尽管用structuremap交换repo可能会更整洁)。

三个数据库和相应的连接字符串。前两个数据库有“孪生”表,第三个数据库有“共享”表。孪生表和共享表之间有FK,所以我认为这会中断。这肯定会中断。(拍摄了很长一段时间,因此我没有把它作为答案。)这是一个想法……它让我思考是否可以使用第二个DB,从主数据库中设置EF,然后在第二个数据库中交换共享表以获得主数据库中表的视图?可能不会,但我会试试。你说的相同结构是什么意思?他们有完全相同的防守吗?那么,两张不同的桌子的用途是什么呢?如果是这样,我建议您在单个表中插入差异标志。如果它们具有交叉字段集,则可以提取超类并继承它。或者,您可以提取接口并仅通过存储库使用数据库,存储库将实现工厂方法。(没有太多上下文信息,因为这些表的名称像Order、Class和Div,这本身就很混乱!Twin很好!)同时,问题是我还没有看到这一点,所以我针对Repo编写了代码,但是没有使用TwinModel方法:要做的代码太多了!
ITwinRepository
TwinReposotoryImplA
TwinRepositoryImplB