2011-10-17 175 views
0

我得到了異常'實體類型[TYPE]不是當前上下文模型的一部分。'當試圖運行我的應用程序。實體框架代碼首先,指向實體

到目前爲止,我的最佳猜測是,它無法將我的類型識別爲它已映射的類型。這很可能是因爲它是運行時加載的類型。這種類型來自不同的組件。

EF:CF如何找到所有要映射的實體,以及如何才能找到我的類型?

+0

你是什麼意思按類型加載在運行時? –

+0

該類型在當前程序集中不存在,但在運行時加載。更詳細的說,它是通過Reflection.Emit創建的。 – Tommy

回答

0

EF並非旨在直接支持此功能。 EF是ORM,而ORM大多是在您指定要在設計時使用和映射的類型並在運行時簡單使用它們的情況下創建的。這並不意味着它不可能在運行時創建類型(使用代碼映射),但它更復雜。

上下文必須知道它應映射的所有類型及其映射。如果你創建的上下文沒有引用你的新類型,它根本不知道它。如何解決它?我能想到的兩個選項:

  • 的Emit上下文代碼,以及與確保發出的上下文代碼包含DbSet<YourEmittedEntityType>型(使用默認映射約定)或發出OnModelCreating方法以及指定自定義映射的公共財產。
  • 也會爲您的新實體發佈配置(從EntityTypeConfiguration<YourEmittedEntityType>派生)。該類將指定將新實體映射到數據庫表。完成配置後,可以手動創建DbModelBuilder註冊所有必要的實體類型配置,包括在運行時創建的新配置,構建DbModel,編譯它並使用DbCompiledModel構建DbContext的新實例。只需讓用戶爲後續使用緩存DbCompiledModel,因爲其構建非常耗時。

在這兩種情況下,確保表用於保存和檢索已創建新的實體,並關閉任何數據庫的初始化 - 您必須手動維護數據庫。

當然,這只是第一步。現在您需要發出/生成將使用您的新實體和上下文的代碼 - 請注意,EF不能與接口一起工作,並且繼承是特別處理的,因此在大多數情況下您需要直接使用您的發射類型的代碼。

+0

我剛纔發現我能夠告訴EntityFramework Code First我的類型。看起來很奇怪,我不能。代碼就在那裏,因爲它需要發現並註冊'正常'類型。你會想我可以註冊額外的類型,並讓EF:CF處理所有其他類型。謝謝(你的)信息! – Tommy