将POCO类映射到动态创建的表
我有一个脚本每小时运行一次,将日志数据存储在日志记录数据库中。每个月都会创建一个新表,并将来自本月的日志信息存储在该表中。将POCO类映射到动态创建的表
创建的每个表是相同的,匹配一个简单的POCO类
class IISLog
{
SystemRef,
date,
s-sitename,
//etc
}
我只发现使用代码优先的方法来访问这些表的单一方式:
var result = this.Database.SqlQuery<WebLog>("select * from " + table + "_" + month);
但是,由于SqlQuery返回该类型的IEnumerable,因此它似乎失去了进程中的延迟加载。
有什么办法让延迟加载占上风,并允许数据上下文跟踪元素? (第一点的主要优先事项)。
通过使用SqlQuery
,您将失去一切 - 这是直接执行SQL而不涉及任何EF功能。它只会为你实现物体。
没有办法在这种类型的数据库表中使用EF。 EF要求该类型只能映射到单个表(或在继承或拆分的情况下映射到一组表)。即使实体完全相同,实体也不能映射到多个表。
如果您想使用EF,您应该在数据库端查找解决方案,并将唯一的数据库视图或表映射到您的实体,或者使用存储过程来正确选择将被查询的表。
我认为这是非常可能的。当然,我还没有开发它,但这里是我开始的地方。首先,你可以让两个查询,查找有关数据库的基本信息:
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,您可以循环使用动态类型来创建重现的映射模式。但请小心不要对每个实例执行此步骤。我认为这可能是你问题的关键。
从来没有我对你的问题非常感兴趣,并对你的最终解决方案感到好奇。