天天看點

Entity Data Model (EDM) 深入分析, Part 1

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="

 Data Source=SQLEXPRESS; Initial Catalog=Northwind; Integrated Security=True; MultipleActiveResultSets=True""

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,如需轉載請自行聯系原作者