[C#][EF]淺談Entity Data Model
Entity Framework主要透過建立.edmx檔案與LINQ提供前端資料操作作業需求,
這和傳統資料存取架構有明顯的差異,下圖是Entity Framewotk資料存取架構。
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檔案(之所以可以撰寫程式碼來使用實體資料模型,都來自該檔案中的類別所提供的支援)。
可以看到分別繼承了ObjectContext與EntityObject 類別,以便支援實體模型的程式化設計功能。
ObjectContext是Entity Framework物件服務最重要的核心類別,
當我們透過LINQ回傳相關資料內容,ObjectContext會自動接手管理這些資料物件(如資料編輯狀態或關聯資訊...等),
ObjectContext有4個建構函式(如下圖)
展開Demo.Designer.cs檔案內容(如下圖)
可以看到總共複寫了三個建構函示,第一個指定了所需的連線字串,名稱部分則是取自組態檔案資訊,
第二和第三個建構函示分別支援單一連線字串名稱及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;
}
}
結果:
參考