首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

ADO.NET Entity Framework 核心架構與靈活資料建模:EDM、ESQL、ObjectContext 與 N 層開發全景解析

     編輯:關於.NET

實體資料模型 (EDM):領域驅動的核心

EDM 建立於 Peter Chen 的 **ER 模型** 之上,將抽象層級提升至**概念模型**,脫離儲存細節。三大核心概念:

  • Entity Type:領域實體 (如 BlogPost),含屬性 (標量/複雜型別) 與導航屬性 (關聯)。
  • Association:實體間關係 (一對多、多對多),為一等公民,非單純外鍵。
  • EntityContainer:實體集與關聯集的邏輯容器,對應 ObjectContext 的查詢入口。

EDM XML 定義範例 (CSDL)


<EntityType Name="BlogPost">
  <Key><PropertyRef Name="BlogPostID" /></Key>
  <Property Name="BlogPostID" Type="Int32" Nullable="false" />
  <Property Name="BlogTitle" Type="String" MaxLength="500" />
  <NavigationProperty Name="Blog" Relationship="FK_BlogPosts_Blogs" FromRole="BlogPosts" ToRole="Blogs" />
  <NavigationProperty Name="Comments" Relationship="BlogComments" FromRole="BlogPosts" ToRole="Comments" />
</EntityType>

<Association Name="FK_BlogPosts_Blogs">
  <End Role="Blogs" Type="Model.Blog" Multiplicity="1" />
  <End Role="BlogPosts" Type="Model.BlogPost" Multiplicity="*" />
  <ReferentialConstraint>
    <Principal Role="Blogs"><PropertyRef Name="BlogID" /></Principal>
    <Dependent Role="BlogPosts"><PropertyRef Name="BlogID" /></Dependent>
  </ReferentialConstraint>
</Association>

為什麼需要新查詢語言?Entity SQL (ESQL)

傳統 SQL 不支援:**繼承查詢、導航屬性路徑、多型結果**。ESQL 延伸 SQL:


-- 查詢至少有一篇文章的部落格,並導航至作者
SELECT VALUE b, b.Person FROM travelEntities.Blogs AS b WHERE b.BlogPosts.Count > 0
  • VALUE 關鍵字投影實體實例而非匿名記錄。
  • 導航路徑 b.BlogPosts.Count 直接操作集合屬性。
  • **資料庫無關**:同一 ESQL 可對應 SQL Server/Oracle/MySQL,由 Provider 轉換原生 SQL。

架構分層:從 EntityClient 到 ObjectServices

層級組件職責典型 API
儲存層SSDL + Provider (SqlClient)資料庫 Schema、原生 SQL 執行DbCommand, DbDataReader
映射層MSL (Mapping Specification Language)CSDL ↔ SSDL 雙向視圖轉換EntitySetMapping, AssociationSetMapping
概念層CSDL + EntityClientEDM 查詢、Client View Engine、命令樹 (CCT)EntityConnection, EntityCommand, EntityDataReader
物件層ObjectServices物質化、變更追蹤、LINQ to Entities、身分解析ObjectContext, ObjectQuery<T>, SaveChanges

EntityClient:輕量級 EDM 查詢


using (var conn = new EntityConnection("name=TravelEntities"))
{
    conn.Open();
    var cmd = conn.CreateCommand();
    cmd.CommandText = "SELECT VALUE b FROM TravelEntities.Blogs AS b WHERE b.BlogPosts.Count > 0";
    using (var rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
        while (rdr.Read()) Console.WriteLine(rdr["BlogID"]);
}

適合**不需物質化**、高效能唯讀報表查詢。

ObjectServices:完整 ORM 體驗


using (var ctx = new TravelEntities()) // 強型別 ObjectContext
{
    // LINQ to Entities
    var post = ctx.BlogPosts
        .Include("Comments.Person")
        .Include("Blog")
        .Where(p => p.Blog.BlogID == blogId)
        .OrderByDescending(p => p.BlogDate)
        .FirstOrDefault();

    post.BlogTitle = "Updated";
    ctx.SaveChanges(); // 單一交易寫入所有變更
}
  • ObjectStateManager:追蹤 Added/Modified/Deleted/Unchanged 狀態,支援樂觀並發 (OptimisticConcurrencyException)。
  • RefreshMode:ClientWins / StoreWins 衝突解決。
  • Include:預載導航屬性 (Span),避免 N+1 問題。

N 層開發:序列化與脫離/重新附加

EF 1.0 重點支援兩種方案:

方案一:ADO.NET Data Services (Astoria / WCF Data Services)

  • RESTful 端點,URI 定址資源 (/Blogs(1)/Comments)。
  • 支援 $filter, $expand, $orderby 等 OData 查詢選項。
  • 客戶端 DataServiceContext 追蹤變更,SaveChanges() 批次送出。

// 伺服端
public class TravelService : DataService
{
    public static void InitializeService(IDataServiceConfiguration config)
        => config.SetEntitySetAccessRule("*", EntitySetRights.All);
}

// 客戶端刪除評論
var ctx = new TravelEntities(new Uri("https://host/TravelService.svc"));
var comment = (Comment)ViewState["Comment"];
ctx.AttachTo("Comments", comment);
ctx.DeleteObject(comment);
ctx.SaveChanges();

方案二:WCF + 自訂合約

  • 實體類別預設可序列化 (DataContractSerializer),導航屬性為 DataMember。
  • 服務端 Attach + DeleteObject + SaveChanges 完成持久化。

[ServiceContract]
public interface ITravelService
{
    [OperationContract] void DeleteComment(Comment comment);
}

public class TravelService : ITravelService
{
    public void DeleteComment(Comment comment)
    {
        using (var ctx = new TravelEntities())
        {
            ctx.Attach(comment);
            ctx.DeleteObject(comment);
            ctx.SaveChanges();
        }
    }
}

EF 不支援與未來展望

限制現狀規劃
批次 DML (Bulk Update/Delete)不支援,需逐筆物質化EF Core 已支援 ExecuteUpdate/Delete
Enum/空間型別EF4 開始支援完整支援
Lazy Loading 透明化需虛擬屬性 + ProxyCore 預設支援
Code First / MigrationEF 4.1 / 4.3 引入Core 核心功能

總結

Entity Framework 以 **EDM 為核心**,向下支援多資料庫 Provider、向上提供 EntityClient/ObjectServices/LINQ 多層抽象,**映射層 (MSL) 解耦領域模型與儲存結構**,實現「資料庫演進不改應用、應用演進不改資料庫」。N 層透過 Data Services/WCF 序列化實體並利用 Attach/Detach 管理狀態。雖 v1 功能未臻完善,但**架構願景清晰**:EDM 將成為 Microsoft 整個資料平台 (Reporting/Analysis/Integration) 的**通用語義模型**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved