Entity Data Model是.NET Framework v3.5 SP1引入的新功能,比Linq To SQL更加強大的ORM,讓開發人員隻需要着眼于領域對象模型的開發,而不需要考慮它們是如何與關系資料庫互動。本系列文章逐漸深入介紹如下内容:EDMX Schema 檔案、Model Browser、映射關系、産生的實體類(Generated entity classes)、文檔(Documentation)等等。
1. EDMX Schema 檔案
可以将EDMX作為XML檔案打開,你會發現該檔案包含3個主要部分。
Conceptual Models (CSDL)
Storage Models (SSDL)
Mapping (MSL)
一般情況下,你沒有必要手動修改EDMX -XML檔案。可視化的EDM 設計器、Mapping Details視窗和Model Browser 視窗包含有上述3個部分,并非常友好地顯示整個Entity Data Model模型。
當你編譯項目時,MSBuild 将從EDMX檔案提取CSDL/SSDL/MSL内容,并放置3個獨立的XML檔案到項目的輸出目錄。
2. Model Browser 視窗
Model Browser視窗以可視的樹形圖顯示概念模型和存儲模型。
3. Mapping details 視窗
EDM設計器也提供了一個不錯的Mapping Details 視窗,包含2個視圖。
Map Entity to Tables / View
這一視圖顯示了資料庫中所有字段和相應實體中的屬性,可以用來檢視和編輯EDM的映射關系。
Map Entity to Functions
這一視圖用來選擇一個特定的存儲過程來插入、更新或删除Entity執行個體。
4. 生成的實體類(Generated Entity Classes)
除了上述的XML Schema檔案外,EDM向導也生成了實體類。下一步仔細分析.Designer.cs檔案中的實體類,并和LINQ to SQL中的類進行比較。
1) 比較 LINQ to SQL class 和 EDM EntityObject class
// LINQ to SQL
[Table(Name="dbo.Employees")]
public partial class Employee : INotifyPropertyChanging, INotifyPropertyChanged
EDM類則是以不同的attributes,并且總是繼承EntityObject或ComplexObject 類。EntityObject 類提供了變更跟蹤和關系管理。
// Entity Data Model
[global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Employee")]
[global::System.Runtime.Serialization.DataContractAttribute()]
[global::System.Serializable()]
public partial class Employee : global::System.Data.Objects.DataClasses.EntityObject
2) 比較LINQ to SQL entity constructor 和 EDM Create method
public Employee()
{
this._Employees = new EntitySet<Employee>(new Action<Employee>(this.attach_Employees), new Action<Employee>(this.detach_Employees));
this._EmployeeTerritories = new EntitySet<EmployeeTerritory>(new Action<EmployeeTerritory>(this.attach_EmployeeTerritories),
new Action<EmployeeTerritory>(this.detach_EmployeeTerritories));
this._Orders = new EntitySet<Order>(new Action<Order>(this.attach_Orders), new Action<Order>(this.detach_Orders));
this._Employee1 = default(EntityRef<Employee>);
OnCreated();
}
EDM沒有生成上述LINQ to SQL的構造函數,而是建立了一個特定的Create方法,并提供了所有必需屬性(not nullable)的輸入參數。
public static Employee CreateEmployee(int employeeID, string lastName, string firstName)
Employee employee = new Employee();
employee.EmployeeID = employeeID;
employee.LastName = lastName;
employee.FirstName = firstName;
return employee;
3) 比較LINQ to SQL 和 EDM : 實體屬性(entity property)
[Column(Storage="_EmployeeID", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
public int EmployeeID
get
{
return this._EmployeeID;
}
set
if ((this._EmployeeID != value))
{
this.OnEmployeeIDChanging(value);
this.SendPropertyChanging();
this._EmployeeID = value;
this.SendPropertyChanged("EmployeeID");
this.OnEmployeeIDChanged();
}
盡管EDM公有屬性(public property)的attribute是不同的,但get和set 基本是一樣的。
[global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
[global::System.Runtime.Serialization.DataMemberAttribute()]
get
return this._EmployeeID;
set
this.OnEmployeeIDChanging(value);
this.ReportPropertyChanging("EmployeeID");
this._EmployeeID = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value);
this.ReportPropertyChanged("EmployeeID");
this.OnEmployeeIDChanged();
4) 比較LINQ to SQL Table 和 EDM ObjectQuery
public System.Data.Linq.Table<Employee> Employees
return this.GetTable<Employee>();
在LINQ to SQL中,調用GetTable 方法,傳回實體集合。在EDM中,通過Object Services compoment 執行Entity SQL 查詢,傳回EntityType的計劃EntitySet。
[global::System.ComponentModel.BrowsableAttribute(false)]
public global::System.Data.Objects.ObjectQuery<Employee> Employees
if ((this._Employees == null))
{
this._Employees = base.CreateQuery<Employee>("[Employees]");
}
return this._Employees;
private global::System.Data.Objects.ObjectQuery<Employee> _Employees;
5) 比較LINQ to SQL DataContext 和 EDM ObjectContext
[System.Data.Linq.Mapping.DatabaseAttribute(Name="Northwind")]
public partial class NorthwindDataContext : System.Data.Linq.DataContext
EDM有一個類似于LINQ to SQL DataContext 的ObjectContext類,ObjectContext 類是負責與EDM 中實體類型互動的基本類。ObjectContext用來建立資料庫連接配接、檢索資料、持久化對象、以及對資料庫的插入、更新和删除操作。
public partial class NorthwindEntities : global::System.Data.Objects.ObjectContext
ObjectContext的連接配接字元串指向中繼資料(CSDL/SSDL/MSL 檔案)和資料源(資料庫連接配接字元串)。
connectionString="metadata=.\NorthwindModel.csdl|.\NorthwindModel.ssdl|.\NorthwindModel.msl;
provider=System.Data.SqlClient; provider connection string=&quot;
Data Source=SQLEXPRESS; Initial Catalog=Northwind; Integrated Security=True; MultipleActiveResultSets=True&quot;"
5. Documentation 屬性
EDM中的實體類型(EntityTypes)、關聯和屬性有一個Documentation屬性,對LINQ to SQL而言,這是一個新的屬性。
Documentation屬性将更新生成的partial實體類的XML注釋,可以用來生成代碼文檔的幫助檔案。
/// <summary>
/// Employee entity which corresponds with the Northwind.Employees table
/// </summary>
/// <KeyProperties>
/// EmployeeID
/// </KeyProperties>
推薦Entity Framework 相關文章:
1. Entity Framework – Update Model From Database, Part 1
<a href="http://blog.entlib.com/EntLib/archive/2008/10/19/entity-framework-update-model-from-database-part-1.aspx">[url]http://blog.entlib.com/EntLib/archive/2008/10/19/entity-framework-update-model-from-database-part-1.aspx[/url]</a>
2. Entity Framework – Update Model From Database, Part 2
<a href="http://blog.entlib.com/EntLib/archive/2008/10/19/entity-framework-update-model-from-database-part-2.aspx">[url]http://blog.entlib.com/EntLib/archive/2008/10/19/entity-framework-update-model-from-database-part-2.aspx[/url]</a>
3. Entity Framework 架構簡介
<a href="http://blog.entlib.com/EntLib/archive/2008/10/19/entity-framework-architecture.aspx">[url]http://blog.entlib.com/EntLib/archive/2008/10/19/entity-framework-architecture.aspx[/url]</a>
4. 比較LINQ to SQL Diagram 和Entity Data Model
<a href="http://blog.entlib.com/EntLib/archive/2008/10/19/linq-to-sql-diagram-entity-data-model.aspx">[url]http://blog.entlib.com/EntLib/archive/2008/10/19/linq-to-sql-diagram-entity-data-model.aspx[/url]</a>
本文轉自 entlib.com 51CTO部落格,原文連結:http://blog.51cto.com/entlib/107889,如需轉載請自行聯系原作者