Entity Framework 是 ADO.NET 中的一組技術,可支援資料導向軟體應用程式的開發。Entity Framework 可讓開發人員使用網域特有之物件和屬性的格式 (如客戶和客戶地址) 來處理資料,而不需要顧慮這些資料儲存在哪些基礎資料庫資料表和資料行內。
Entity Framework 藉由讓開發人員處理更高的抽象層級,因此可支援與任何特定資料儲存引擎或關聯式結構描述無關的程式碼。開發人員可以建立資料存取應用程式,其方式是針對概念應用程式模型進行程式設計,而不是直接針對關聯式儲存結構描述進行程式設計。
Entity Framework 應用程式和服務是由概念模型、儲存模型及兩者之間的對應所組成。為了符合從現有資料庫衍生 Entity Data Model (EDM) 之開發人員的需求,Entity Framework 提供了一組工具,這些工具可產生及驗證 EDM,並根據概念模型建立可程式化類別。
透過 EDM,ADO.NET 會將實體公開為 .NET 環境內的物件。如此可讓物件層成為 Language-Integrated Query (LINQ) 支援的理想目標。LINQ to Entities 可讓開發人員針對 Entity Framework 物件內容建立彈性且強型別的查詢,其方式是直接從開發環境使用 LINQ 運算式和 LINQ 標準查詢運算子。如需有關 Entity Framework 和 LINQ to Entities 的詳細資訊,請參閱 Entity Framework 文件集。
從 SQL Server Compact 4.0 開始,SQL Server Compact 就支援適用於 Web 應用程式平台的 Entity Framework。
若要搭配 SQL Server Compact 4.0 使用 Entity Framework,請先安裝 Entity Framework。Entity Framework 是 .NET Framework 4 的一個元件。
SQL Server Compact 4.0 的開發支援由 Visual Studio 2010 Service Pack 1 提供。Visual Studio 2010 Service Pack 1 中 Entity Framework 的實體資料模型設計工具支援是由 Entity Framework 工具所提供。請注意從 Visual Studio 2008 Service Pack 1 (SP1) 開始,Entity Data Model 設計工具 (Entity 設計工具) 就是 Visual Studio 的一個元件。它是用於建立及編輯 Entity Data Model (EDM) 的視覺化工具。如需有關此工具的詳細資訊,請參閱 Entity Framework 文件集。
在 SQL Server Compact 4.0 版本中,SQL Server Compact 提供了 Managed 組件:System.Data.SQLServerCe.Entity.dll。System.Data.SQLServerCe.Entity.dll 組件是由 ADO.NET Managed 資料提供者 System.Data.SqlServerCE.dll 在內部所使用,並可支援實體資料模型 (EDM) 中所述的資料存取。
當您安裝 SQL Server Compact 4.0 或 SQL Server Compact 更新版本 (SSCERuntime-ENU.msi) 時,System.Data.SQLServerCe.Entity.dll 會安裝在 %ProgramFiles%\Microsoft SQL Server Compact Edition\v4.0 資料夾底下。
注意
您只能在 .NET Framework 版本 4 中搭配 Entity Framework 4 使用 SQL Server Compact 4.0。SQL Server Compact 4.0 不支援 .NET Framework 3.5,並且會擲回錯誤。
SQL Server Compact 4.0 支援 ADO.NET Entity Framework 4 的預先編碼程式撰寫模型。有兩個方式可建立 Entity Framework Web 應用程式:先建立資料庫及先建立模型。先建立模型是 ADO.NET Entity Framework 4 (.NET Framework 4) 中的一項新功能,可針對稱為預先編碼 / 僅限程式碼的開發啟用更以程式碼為中心的開發工作流程。在此工作流程中,CODE 是您的模型。預先編碼程式撰寫模型的運作方式如下:
若要使用「僅限程式碼」,您應該建立一些 POCO (單純 CLR 物件) 類別。這些類別主要是由建構函式所組成。
下一步是撰寫衍生自 ObjectContext 的類別,以描述模型的形狀以及您想要存取 POCO 類別的方式。這是 Entity Framework 感知類別。
您在這個階段擁有 CLR 的所有內容,但是使用 ObjectContext 類別一定要有 Entity Framework 中繼資料 (儲存在 EDMX 檔案中)。在「僅限程式碼」中,沒有 EDMX 檔案。
為了使用中繼資料,您需要定義 ContextBuilder (您會在此定義您的 SqlConnection)。ContextBuilder 會掃描 ObjectContext 的所有屬性,並依照慣例推斷預設概念模型、儲存模型和對應。然後,它會使用您透過 ContextBuilder 傳遞的中繼資料和 SqlConnection,以建立 EntityConnection。
之後會將 EntityConnection 傳遞給建構函式 (在 POCO 類別中所建立) 來建立 ObjectContext 的執行個體。
一旦建立內容的執行個體之後,您就可以使用許多擴充方法執行以下作業:
自動建立資料庫指令碼
檢查資料庫是否存在
建立資料庫
卸除資料庫等
您也可以覆寫慣例,而不使用原有的慣例。在 Entity Framework 4 中,ContextBuilder 會重構為 ModelBuilder 和 DbModel。
若要下載,請移至 ADO.NET Entity Framework 4。
當 SQL Server Compact 搭配 Entity Framework 使用時的一些限制如下:
當 SQL Server Compact 4.0 搭配 Entity Framework 使用時,可支援具有伺服器產生之索引鍵或值的實體,前提是索引鍵的類型為識別欄位。
當使用 Entity Framework 時,實體的索引鍵可能會標示為伺服器所產生。如此可讓資料庫針對插入的索引鍵或實體建立產生值。另外,某個實體可能會有零個或多個屬性標示為伺服器所產生的值。如需詳細資訊,請參閱 Entity Framework 文件集中的<存放區產生的模式>主題。
Entity Framework 可讓您定義具有伺服器產生之索引鍵或值的實體類型。在具有伺服器產生之值的某個實體上進行資料操作,而實體類型不是識別時,將會擲回「不支援」的例外狀況。
如果 SQL Server Compact 結構描述中的條件約束名稱重複,將無法產生 SQL Server Compact 4.0 的實體資料模型。
在 SQL Server Compact 中,如果條件約束名稱在資料表中是唯一的,就允許資料庫存在名稱重複的條件約束。其行為與 SQL Server 的行為不同,條件約束名稱在資料庫中是唯一的。如果 SQL Server Compact 4.0 結構描述的參考完整性 (主索引鍵 - 外部索引鍵關聯性) 條件約束名稱重複,則使用 ADO.NET Entity Framework 的實體資料模型精靈產生實體資料模型將會失敗。您應該在條件約束名稱中加入資料表的名稱,在資料庫中保留條件約束名稱的唯一性。
SQL Server Compact 不支援使用 Entity Framework 的完整外部聯結,但是 Entity SQL 則支援完整外部聯結。例如,下列查詢不受支援:
Entity SQL:
SELECT c.Name, c.Id, o.Id FROM NW.Customers AS c FULL OUTER JOIN NW.Orders AS o ON c.Id = o.CustomerId
請注意,SQL Server Compact 支援使用 Entity Framework 的內部聯結、左方外部聯結和右方外部聯結。
SQL Server Compact 不支援 Entity SQL 查詢之 ORDER BY 子句中的 COLLATE 子子句。
Entity SQL 允許 COLLATE 子子句可指定為 ORDER BY 子句中每一個索引鍵的一部分。COLLATE 子子句僅適用於字串-值運算式,而且會決定要用於該運算式的比較語意。
當 SQL Server Compact 搭配 Entity Framework 一起使用時,並不支援在 Entity SQL 查詢的 ORDER BY 子句中使用 COLLATE 子子句。例如,下列查詢不受支援:
Entity SQL:
SELECT value c FROM NW.Customers AS c ORDER BY c.Name COLLATE Traditional_Spanish_ci_ai
跟 SQL Server 不同的是,SQL Server Compact 並不支援 real、float、money 和 numeric 資料類型上的模數運算 (以 % 表示)。
在 SQL Server Compact 中,下列查詢會產生錯誤訊息:
Entity SQL:
( CAST ( 1 AS Edm.Int16) % CAST ( 1 AS Edm.Decimal) )
Transact-SQL:
SELECT cast (1 as smallint) %cast (1 as decimal(28,4))
當您執行這類查詢時,將會顯示以下錯誤訊息:「real、float、money 和 numeric 資料類型不支援模數。[ Data type = numeric ]」
SQL Server Compact 不支援彙總 (max、min、sum、count) 中的 DISTINCT。
如果您嘗試撰寫在彙總 (max、min、sum、count) 中使用 DISTINCT 的 Entity SQL 和 Transact-SQL 查詢,將會擲回「不支援」的例外狀況。下列範例示範在彙總 count 中使用 DISTINCT 的 Entity SQL 查詢。
Entity SQL:
SELECT count(distinct [TaskId]) FROM ArubaContainer.TaskSet AS [Task]
當 SQL Server Compact 搭配 Entity Framework 使用時,不支援命令逾時。
Entity Framework 會啟用命令逾時,其指定方式是利用 ObjectContext.QueryTimeout 屬性或 EntityCommand.CommandTimeout 屬性。
當 SQL Server Compact 搭配 Entity Framework 使用時,不支援逾時。換句話說,命令逾時不能設定為零以外的值。如果設定了連接逾時屬性,SQL Server Compact 資料庫會擲回 NotSupportedException(“CommandTimeout”) 例外狀況。
SQL Server Compact 只支援 Unicode 字串。
Entity Framework 同時提供了 Unicode 和非 Unicode 字串的支援。SQL Server Compact 只支援 Unicode 字串。目前提供者不支援 'String' 類型的常值 <literal>。非 Unicode 字串中的 SQL Server Compact 會擲回「接近常數常值」的例外狀況。
SQL Server Compact 不支援預存程序和檢視。
若要了解如何建立使用 SQL Server Compact 資料庫當做資料來源的 Entity Framework 應用程式,請參閱<建立 Entity Framework 應用程式 (SQL Server Compact)>。