【发布时间】:2020-02-19 18:35:20
【问题描述】:
我有一个网络服务,它尝试连接到桌面会计应用程序的数据库。
它有同名但不同模式名称的表,例如:
[DatabaseName].[202001].[CustomerCredit]
[DatabaseName].[202002].[CustomerCredit]
.
.
.
[DatabaseName].[202014].[CustomerCredit]
[DatabaseName].[202015].[CustomerCredit]
[DatabaseName].[202016].[CustomerCredit]
...
..
[DatabaseName].[2020xx].[CustomerCredit]
架构名称的格式为[Year+IncrementalNumber],例如[202014]、[202015]、[202016]等。
每当我想在数据库中查询客户信用信息时,如果 202016 是我数据库中的最新架构,我应该从具有最大数字的架构中获取信息,例如 [DatabaseName].[202016].[CustomerCredit]。
注意: 会计应用程序数据库中新模式的创建没有规则,完全由会计应用程序的用户决定,安装在不同位置的每个应用程序实例可能有不同的模式数。
所以当我开发我的网络服务时,我不知道在开发之前连接到哪个架构。在运行时,我可以找到正确的模式以从其表中查询,但我不知道如何设法在查询中获取具有正确模式名称的表信息。 我通常创建一个 linq-to-sql dbml 类并使用它的定义从 db 读取信息,但我不知道如何以这种方式管理架构更改?
DBML 设计器像这样管理 Scehma 名称:
[global::System.Data.Linq.Mapping.TableAttribute(Name="[202001].CustomerCredit")]
但是,由于我的应用程序可以在运行时检索架构名称,我不知道如何在我的特殊情况下修复表声明。 在 ADO.NET 中很容易处理,但我不知道它在 Linq2SQL 中的等价物:
select count(*) from [" + Variables.FinancialYearSchemaName + "].CustomerCredit where SFC_Status = 100;
【问题讨论】:
-
这不是 LINQ2SQL 问题,而是数据库设计问题。对于初学者,如果您使用table partitioning,则不需要这些表。分区在所有 SQL Server 版本中都可用。它曾经是企业独有的功能,但自 SQL Server 2016 SP1 起,它可用于所有版本,甚至是 Express
-
在旧版本(即不受支持的版本)中,您可以使用 Partitionend views 将所有这些表合并为一个。如果表有约束,例如在
date列上明确使用哪个表,服务器将只查询该单个表。 -
简而言之,Linq2Sql 不必知道数据是如何分区的。 LINQ2SQL 是 ORM,而不是 SQL 替代品,它所要做的就是将对象映射到关系结构
-
@PanagiotisKanavos 所以你建议制作分区视图而不是在 linq2sql 中寻找解决方案?我的偏好不是在数据库层中寻找解决方案,因为目前数据库的设计不在我的范围内,而且我没有足够的授权来做这件事。除了以前版本的 Web 服务使用 ADO.NET 并且可以正常工作,但我决定将其迁移到 Entity Framework 和 Linq2SQL 但这是我的挑战之一
-
这是一个与对象完全没有关系的数据库问题。
was using ADO.NET and works without problem相反,它有完全相同的问题。它只是隐藏在视线之外,实际上传递给了其他人。数据库设计无缘无故地溢出到应用程序中。 DBA 无法在不破坏所有应用程序的情况下管理数据库。将旧数据移动到历史表等会破坏所有查询
标签: c# entity-framework linq-to-sql ado.net dbml