2011-03-11 97 views
0

我有,我想我的用戶動態地創建類型的Web應用程序在運行時創建的類型......我可以做到這一點使用反射,但我不知道如何使用堅持該類型實體框架如何堅持使用實體框架

+1

你能否提供更多關於你有什麼要求和你想要做什麼的信息。只需要序列化你的對象並將它保存在例如XML列? – Yakimych 2011-03-11 12:16:31

+0

你可以請我鏈接到任何這樣的實施... – 2011-03-12 13:44:01

回答

2

再次 - 這種方法是否適用(無論如何它是一種解決方法)取決於您的方案。但是,你可以做的是序列化你的對象並將其存儲在數據庫字段中。你基本上可以序列化成任何格式(二進制,json,xml,...)。

注:當使用xml數據類型,你可以實際上查詢對象中的數據(不知道你是否能與EF直接做到這一點,但你總是可以寫一個SP與EF稱呼它)。一個例子見this link

Here是SQL Server存儲序列化對象的概述。

Here是一個XML序列化的實現。您可以使用它將您的對象序列化爲字符串,然後再將其分配給您的實體屬性。

1

您不能這樣做,因爲實體框架不會爲動態創建的類型映射元數據,對於新實體,上下文不會有ObjectSet,並且數據庫不會爲您的新類型創建表。

爲EF元數據的集中存儲爲MetadataWorkspace類,但在EF的當前版本是不應該這個類在運行時進行修改。它不提供任何方法來做到這一點。 define MetadataWorkspace at runtime的唯一方法是修改SSDL(數據庫描述),MSL(映射描述)和CSDL(實體類描述)文件。因此,任何的「動態」的方法來EF指:

  • 在運行時創建類型(Reflection.Emit的)
  • 創建派生ObjectContext含有新ObjectSet在運行時(Reflection.Emit的)
  • 修改數據庫以包含新的表
  • 在運行時在運行時創建所有這些映射文件
  • 負載映射文件,與創建MetadataWorkspace創建新EntityConnection並把它傳遞到動態創建ObjectContext派生類型的實例
  • 寫代碼能夠與動態創建的實體合作
  • 寫一些代碼,能夠堅持對新實體類型和新的對象上下文的信息,否則你不會有這些類型的可重新啓動應用程序

編輯:

您也可以使用@Yakimych提到的解決方法。序列化動態類型的實例並將其保存爲varbinary(二進制序列化)或varchar(xml序列化)。您將只需要簡單的表格,使用Id(PK)和序列化數據的列。您將通過Id查詢表並自行處理反序列化。您將無法通過類型特定的屬性查詢表。

+0

我認爲@ yakimych的方法會更簡單,我的方案....謝謝 – 2011-03-12 13:46:51