2012-07-02 46 views
1

一直存在的關於這一主題(Modifying an Entity Framework Model at Run-Time)討論相當位,但到目前爲止,我還沒有能夠找到一個很好的解決問題的辦法。我們目前有一個使用EF 4.0構建的模型,並且需要允許客戶將自定義字段添加到各個表中。目前我們已經用一些描述新屬性的通用表格解決了這個問題,但是我們發現解決方案表現不佳。修改在運行時的ORM模型

有誰知道的動態列添加到數據庫,並更新ORM,以反映在運行時的好辦法?

+0

我想這線程回答你的問題 的http://計算器。com/questions/4019895 /修改實體框架模型在運行時 –

回答

2

在運行時更新EF以反映數據庫中的更改沒有好的,好的或可管理的方法。如果你真的有一個必須在運行時更改的數據庫,EF對你來說不是好工具。 EF是強類型的 - 對數據庫的每次更改都必須不僅反映在映射中,而且還反映在用於加載和保持數據的實體類中。

在運行時更改實體類總是會在運行時發送IL代碼的區域。如果您通過創建具有動態模塊和動態實體類型的動態裝配過程,您將面臨許多新挑戰:

  • 您不會更改現有類型 - 每次用戶添加時都會生成一個新類型或刪除一些財產。
  • 新類型爲重建上下文的元數據工作空間帶來了新的性能成本。如果您在服務器上使用它,則還必須確保它已正確同步。另一個問題是舊類型的所有現有實例(在添加或刪除屬性之前)現在對於EF上下文的新實例是未知的並且不能被持久化。如果你想持久保存它們,你也需要具有舊元數據工作空間的EF上下文實例。
  • 很多代碼可能會使用dynamic而不是實際類型=無編譯時檢查。當直接與EF進行交互時,繼承和接口將不會有用,因爲必須映射繼承(您不需要它),並且接口不被EF接受。
  • 新的類型在設計時是未知的 - 你不能用它來設計時間碼和編譯。
  • EF不喜歡dynamicExpandoObject,因爲它使用反射映射 - >在運行時動態實例必須是正確的類型,否則反射將無法正常工作。
  • 如何爲動態類型編寫查詢?查詢通常始於爲具體類型創建的DbSetObjectSet的通用實例 - 您必須能夠動態地創建這些實例。泛型參數必須是映射到當前上下文的類型 - dynamic在這種情況下不起作用,因爲它不是映射類型。
  • 對於這種情況,.NET有很好的行爲。它不能卸載組件。因此,每當您生成一個新類型時,您也會加載舊時間。

您還是要在運行時改變EF?你目前的做法是正確的。簡單地調整它以獲得更好的性能,但要注意這些要求始終伴隨着性能成本 - 尤其是EF。

替代地使用與鏈接表中提到的最後一種方法 - 預定義的自定義字段的固定數量的直接在主實體。

+0

感謝您的回答,我們將做一些分析,並看看是否有任何可加快的領域。我懷疑我們調用SaveChanges的次數可能太高。 –