[C#][EF]淺談Entity Data Model

  • 11847
  • 0
  • C#
  • 2012-06-18

[C#][EF]淺談Entity Data Model

Entity Framework主要透過建立.edmx檔案與LINQ提供前端資料操作作業需求,

這和傳統資料存取架構有明顯的差異,下圖是Entity Framewotk資料存取架構。

image

Entity Framework資料存取架構。

 

我們可以看到Entity Framework透過實體資料模型(EDM)對應底層資料庫架構,

達到徹底切割客戶端程式碼與底層資料來源,

這對開發人員來說只要專心處理資料邏輯,而不用應付各類型的資料來源而分心。

 

而整個Entity Framewotk可說都圍繞EDM這個資料的概念模型打轉,而其中最重要的核心檔案便是.edmx檔案,

.edmx檔案內容包含三個部分,概念結構定義語言-CSDL(Conceptual Schema Definition Language)、

儲存結構定義語言-SSDL(Store Schema Defiinition Langrage)和對應規格語言-MSL(Mapping Specification Language),

信運的我們不必手工打造相關內容,只需透過Visual studio提供的實體資料模型精靈,

就會依據EDM Designer所建立的模型自動產生相對應的.edmx檔案進而完成實現EDM。

(三種模型內容大家可參考MSDN說明,這裡就不深入.edmx檔案內容....我真懶XD)

 

EMDX與類別檔

開啟先前專案所建立Demo.Designer.cs檔案(之所以可以撰寫程式碼來使用實體資料模型,都來自該檔案中的類別所提供的支援)。

image

可以看到分別繼承了ObjectContextEntityObject 類別,以便支援實體模型的程式化設計功能。

 

ObjectContext是Entity Framework物件服務最重要的核心類別,

當我們透過LINQ回傳相關資料內容,ObjectContext會自動接手管理這些資料物件(如資料編輯狀態或關聯資訊...等),

ObjectContext有4個建構函式(如下圖)

image

展開Demo.Designer.cs檔案內容(如下圖)

image

可以看到總共複寫了三個建構函示,第一個指定了所需的連線字串,名稱部分則是取自組態檔案資訊,

第二和第三個建構函示分別支援單一連線字串名稱及EntityConnection型別物件。

 

當我們建立一個demoEntities實體物件時,這時db(如下簡單程式碼)會自動處理需要的連線作業資訊,

以利我們可以後續進行資料相關新增、刪除和更新作業(ObjectSet<TEntity> 類別),

它同時也繼承了ObjectQuery<T> 類別,進而支援物件搜尋功能。

 using( demoEntities db = new demoEntities() )
{
   ...
   . . .  ...
}

 

 

另外我們也可以取得相關資訊,個人覺得在debug時還滿有用的。

using( demoEntities db = new demoEntities() )
            {    
                try
                {
                    var qry = ( from t in db.nopt_qtpls
                                where t.BILL_NO == "HA0012013788"
                                select t ).Take(1);                       
                    StringBuilder sb = new StringBuilder();
                    string ElementTypeFullName = qry.ElementType.FullName.ToString();
                    sb.AppendLine( string.Format( "元素類型完整名稱:{0}", ElementTypeFullName ) );

		
                    string ExprEssion = qry.Expression.ToString();
                    sb.AppendLine( string.Format( "運算式:{0}", ExprEssion ) );

		
                    string provider = qry.Provider.ToString();
                    sb.AppendLine( string.Format( "查詢提供者:{0}", provider ) );

		
                    string Sql = ( ( ObjectQuery ) qry ).ToTraceString();
                    sb.AppendLine( string.Format( "SQL命令:{0}", Sql ) );

		
                    db.Connection.Open();

		
                    string ConnectionString = db.Connection.ConnectionString.ToString();
                    sb.AppendLine( string.Format( "連線字串:{0}", ConnectionString ) );

		
                    string Timeout = db.Connection.ConnectionTimeout.ToString();
                    sb.AppendLine( string.Format( "連線 Timeout:{0}", Timeout ) );

		
                    string DataSource = db.Connection.DataSource.ToString();
                    sb.AppendLine( string.Format( "連線資料來源:{0}", DataSource ) );

		
                    string DbVersion = db.Connection.ServerVersion.ToString();
                    sb.AppendLine( string.Format( "連線資料庫版本:{0}", DbVersion ) );

		
                    string Status = db.Connection.State.ToString();
                    sb.AppendLine( string.Format( "連線狀態:{0}", Status ) );   
                    
                    return sb.ToString();    
                }
                catch( Exception ex )
                {
                    return ex.Message;                    
                }       
            }            

 

 

 

結果:

image  

image

 

 

 

 

 

 

參考

Entity Framework 概觀

.edmx 檔案概觀 (Entity Framework)

CSDL 規格

SSDL 規格

MSL 規格

ObjectContext 類別

ObjectSet<TEntity> 類別

ObjectQuery<T> 類別

EntityObject 類別

EntityConnection 類別