【问题标题】:Mapping POCO Class to Dynamically Created Tables将 POCO 类映射到动态创建的表
【发布时间】:2011-09-30 11:43:07
【问题描述】:

我有一个脚本每小时运行一次,将日志数据存储在日志数据库中。每个月都会创建一个新表,并将本月的日志记录信息存储在该表中。

创建的每个表都是相同的,并且匹配一个简单的 POCO 类

class IISLog
{
  SystemRef,
  date,
  s-sitename,
  //etc
 }

我只找到了一种使用代码优先方法访问这些表的方法:

 var result = this.Database.SqlQuery<WebLog>("select * from " + table + "_" + month);

但是,由于 SqlQuery 返回该类型的 IEnumerable,我似乎失去了进程中的延迟加载。

有什么方法可以让延迟加载占上风,并允许数据上下文跟踪元素? (第一点的主要优先级)。

【问题讨论】:

    标签: .net sql-server entity-framework ef-code-first


    【解决方案1】:

    使用SqlQuery 将失去一切——即直接执行 SQL 而不涉及任何 EF 功能。它只会为您具体化对象。

    这种类型的数据库表无法使用 EF。 EF 要求该类型只能映射到单个表(或在继承或拆分的情况下的表集)。即使它们完全相同,实体也不能映射到多个表。

    如果你想使用 EF,你应该在数据库端寻找解决方案,并且只将单个数据库视图或表映射到你的实体,或者使用存储过程来正确选择将被查询的表。

    【讨论】:

      【解决方案2】:

      我认为这是很有可能的。当然,我还没有开发它,但这是我要开始的地方。首先,您可以进行两个查询来查找有关您的数据库的基本信息:

      SELECT * FROM INFORMATION_SCHEMA.TABLES
      SELECT * FROM INFORMATION_SCHEMA.Columns where TABLE_NAME = 'MyTableName'
      

      编辑:从这里您将通过循环获得一个表格列表及其各自的属性。 如果您使用约定优于配置,则可能不需要此步骤。

      从这里您可以在运行时使用反射 TypeBuilder 和 FieldBuilder 创建您的自定义对象。一个例子是http://mironabramson.com/blog/post/2008/06/Create-you-own-new-Type-and-use-it-on-run-time-%28C%29.aspx

      接下来,使用带有自定义 DbContext 的 EF Code First 并覆盖 OnModelCreating(...) 来映射您的动态对象。使用 Fluent API,您可以遍历动态类型以创建重复出现的映射模式。但是请注意不要在每次实例化时都执行此步骤。我认为这可能是您问题的症结所在。

      我对您的问题非常感兴趣,并对您的最终解决方案感到好奇。

      【讨论】:

        猜你喜欢
        • 2017-07-04
        • 1970-01-01
        • 2018-03-19
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-18
        • 1970-01-01
        相关资源
        最近更新 更多