2011-09-30 67 views
0

我有一個腳本每小時運行一次,將日誌數據存儲在日誌記錄數據庫中。每個月都會創建一個新表,並將來自本月的日誌信息存儲在該表中。將POCO類映射到動態創建的表

創建的每個表是相同的,匹配一個簡單的POCO類

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

我只發現使用代碼優先的方法來訪問這些表的單一方式:

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

但是,由於SqlQuery返回該類型的IEnumerable,因此它似乎失去了進程中的延遲加載。

有什麼辦法讓延遲加載佔上風,並允許數據上下文跟蹤元素? (第一點的主要優先事項)。

回答

1

通過使用SqlQuery,您將失去一切 - 這是直接執行SQL而不涉及任何EF功能。它只會爲你實現物體。

沒有辦法在這種類型的數據庫表中使用EF。 EF要求該類型只能映射到單個表(或在繼承或拆分的情況下映射到一組表)。即使實體完全相同,實體也不能映射到多個表。

如果您想使用EF,您應該在數據庫端查找解決方案,並將唯一的數據庫視圖或表映射到您的實體,或者使用存儲過程來正確選擇將被查詢的表。

0

我認爲這是非常可能的。當然,我還沒有開發它,但這裏是我開始的地方。首先,你可以讓兩個查詢,查找有關數據庫的基本信息:

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,您可以循環使用動態類型來創建重現的映射模式。但請小心不要對每個實例執行此步驟。我認爲這可能是你問題的關鍵。

從來沒有我對你的問題非常感興趣,並對你的最終解決方案感到好奇。