【问题标题】:Using Entity Framework with Archive databases将实体框架与存档数据库一起使用
【发布时间】:2017-03-23 01:59:24
【问题描述】:

我正在使用 Entity Framework 6 进行基本的 CRUD 操作,这一切都很好。我需要能够在一个日期范围内选择我的对象,这同样非常简单,但是,这些对象可以分布在几个数据库中,这些数据库基本上是上一年数据的仓库。一旦我们在一个日期范围内寻找它们。

例如,我们想要 2015 年 1 月 1 日到 2016 年 11 月 9 日之间的所有 Foo 对象; 2015 年的 Foo 数据将位于不同的数据库中。这可以追溯到 2005 年。并非所有的模式都是相同的。

我们可以拥有 11 个 EF 项目,或 11 个上下文和 11 个连接字符串。该解决方案的问题是每年创建存档时都必须添加代码。这似乎是一个黑客。在可预见的未来,切换到 Azure 存储方法不是一种选择。

还有更优雅的解决方案吗?

【问题讨论】:

    标签: c# .net entity-framework archive data-warehouse


    【解决方案1】:

    只要您的所有数据库对于您要查询的实体都具有相同(或相似)的架构,您就可以为所有数据库使用一个 DbContext 并简单地切换连接字符串。您将必须管理连接字符串列表并遍历它们,连接到每个字符串并查询每个字符串的数据。当然,如果您的数据库以一致的方式命名(例如根据年份),您不需要维护所有连接字符串。如果您的查询只命中一个数据库,那么您可以计算哪个是适当的连接字符串并使用它。这最终看起来像标准的分片策略。 Here 是对 Microsoft 用于 EF 的 SQL Azure 分片库的引用,这也可能是一种解决方案

    或者,您可以使用 SQL Server 的跨数据库查询功能并设置跨所有数据库的视图。这有维护问题,更不用说性能问题了,但是我不知道你的数据大小。

    【讨论】:

    • 这听起来是个好计划!因此,我们将查看某种正则表达式来查看连接字符串(大概在 web.config 中?)并交换。我要查找的表的架构相似但不相同。我会通过 fluent 进行重新映射,还是仅仅依靠 EF 的约定为我进行映射? (会 +1,但我是
    • @Jimbob 您无法在运行时重新映射 EF,因此请创建多个 DbContexts 或创建您的实体,以便它们包含所有数据库中的所有可能字段,然后检查不一致的字段。您最好在数据访问层前面有一个应用层,以提供一致的数据视图
    • 所以我们每年都会关注新的背景?我正在考虑让其中一个 DBA 使用我们可以将日期参数传递给的存储过程来对服务器端进行排序。这样会更好吗?
    • 如果模式不断变化,那么您将不得不不断将存储的过程添加到新的数据库中。我个人会选择添加到所有存档数据库中的视图,这些数据库提供一致的模式供查询。在数据库中使用它比在应用程序代码中更可取,因为它可以从源头解决问题
    • 所以你说的是DBA的问题? :-) 目前类似的功能也有类似的情况,我只是希望 EF 能够在代码中优雅地处理它,而不是调用存储的过程。
    猜你喜欢
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    相关资源
    最近更新 更多