对于在 实体数据模型 (EDM) 上构建的应用程序而言,管理有关员工技能信息的方案很值得探讨。此应用程序可帮用户确定系统中包含的所有员工的技能,或找到拥有可识别技能的员工。
员工技能的信息使用 EDM 实体和关联来指定。技能实体用名称和简要说明标识员工技能。有关技能的补充信息由包含定位到这些信息的 URL 的实体提供。在此补充信息与其描述的技能之间存在一个关联连接。系统中员工以往同事所做的评价将作为实体实现,这些实体通过与代表其所评价员工的实体之间的关联提供。
从 XML 设计架构开始实现此应用程序。由此架构生成可编程类。将创建一个数据库,用来支持设计架构中声明的实体和关联。设计架构中定义的类型通过存储元数据架构的方式映射到数据库。
EDM 应用程序的设计可以合并现有数据,但如果数据库为支持设计中的对象模型而专门构建,这个过程极易实现。
下面的屏幕显示此应用程序和对员工技能的查询结果。此应用程序开始运行时,Employees 网格视图将显示系统中所有员工的姓名。单击任意 employee 行将在 Skills 网格视图中显示该员工的技能。在屏幕显示中,单击表示描述为 ADO.NET 的技能所在的行,其结果将在 Skills/References 文本框中显示。Skills 由 Skills 实体包含的简要说明来描述。与 Skills 实体关联的 SkillInfo 实体中的 URL 提供了指向其他信息的链接。最终显示与员工关联的 References 的姓名、职位和电子邮件地址。
.gif)
设计
要设计能够满足跟踪员工技能的所有需求的应用程序,需要进行的分析可能比本示例中所做的分析更为详尽。无论分析的范围如何,所发现的细节都将用于构成应用程序域中的实体、实体属性和关联。这些实体、属性和关联在概念架构定义语言 (CSDL) 中正式指定。
本应用程序域中的四个抽象实体和它们之间的三个关系非常重要。这些实体和关联定义用于标识和描述员工及其技能的数据。在用于实现此应用程序中用到的数据的架构中,声明并定义了以下七个 EDM 类型。
- Employees 
- References 
- Skills 
- SkillInfo 
- Skill_EmployeeAssociation 
- Reference_EmployeeAssociation 
- SkillInfo_SkillAssociation 
Employees
此架构示例中的 Employees 有五个类型化属性和两个导航属性。
EmployeeId:指定为 Guid 数据类型的键属性,唯一标识实体实例。
LastName:字符串属性,包含 Employee 姓的值
FirstName:字符串属性,包含 Employee 名的值
Alias:字符串属性,包含公司网络凭据中的别名
Email:字符串属性,包含 Employee 的电子邮件地址
Skills:导航属性,用于浏览 Employees 和 Skills 实体间的关联。
References:导航属性,用于浏览 Employees 和 References 实体间的关联。
有关导航属性的更多信息,请参见导航属性 (EDM)。
HRSkills 应用程序使用如下 CSDL 语法定义 Employees 实体及其属性。
        <EntityType Name="Employees">
          <Key>
            <PropertyRef Name="EmployeeId" />
          </Key>
          <Property Name="EmployeeId" Type="Guid" Nullable="false" />
          <Property Name="LastName" Type="String" Nullable="false"
              MaxLength="50" Unicode="true" FixedLength="false" />
          <Property Name="FirstName" Type="String" MaxLength="50"
              Unicode="true" FixedLength="false" />
          <Property Name="Alias" Type="String" Nullable="false"
              MaxLength="50" Unicode="true" FixedLength="false" />
          <Property Name="Email" Type="String" MaxLength="50"
              Unicode="true" FixedLength="false" />
          <NavigationProperty Name="References"
 Relationship="HRSkillsModel.Reference_Employee" FromRole="Employees"
             ToRole="References" />
          <NavigationProperty Name="Skills"
  Relationship="HRSkillsModel.Skill_Employee" FromRole="Employees"
            ToRole="Skills" />
        </EntityType>
除上述 Employees 实体外,还要实现表示 Skills、Skill Information 和 References 的实体及它们之间的三个关联。下面的 CSDL 架构声明和定义 HRSkills 应用程序用到的所有实体和关联。这个完整架构用于生成由应用程序代码使用的对象模型。有关从架构生成对象模型的信息,请参见“如何:如何:使用 EdmGen.exe 生成实体数据模型(实体框架)”。
<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="HRSkillsModel" Alias="Self"
             xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
        <EntityContainer Name="HRSkills">
          <EntitySet Name="Employees"
                  EntityType="HRSkillsModel.Employees" />
          <EntitySet Name="References"
                  EntityType="HRSkillsModel.References" />
          <EntitySet Name="SkillInfo"
                  EntityType="HRSkillsModel.SkillInfo" />
          <EntitySet Name="Skills" EntityType="HRSkillsModel.Skills" />
          <AssociationSet Name="Reference_Employee"
                 Association="HRSkillsModel.Reference_Employee">
            <End Role="Employees" EntitySet="Employees" />
            <End Role="References" EntitySet="References" />
          </AssociationSet>
          <AssociationSet Name="Skill_Employee"
                 Association="HRSkillsModel.Skill_Employee">
            <End Role="Employees" EntitySet="Employees" />
            <End Role="Skills" EntitySet="Skills" />
          </AssociationSet>
          <AssociationSet Name="SkillInfo_Skill"
                  Association="HRSkillsModel.SkillInfo_Skill">
            <End Role="Skills" EntitySet="Skills" />
            <End Role="SkillInfo" EntitySet="SkillInfo" />
          </AssociationSet>
        </EntityContainer>
        <EntityType Name="Employees">
          <Key>
            <PropertyRef Name="EmployeeId" />
          </Key>
          <Property Name="EmployeeId" Type="Guid" Nullable="false" />
          <Property Name="LastName" Type="String" Nullable="false"
              MaxLength="50" Unicode="true" FixedLength="false" />
          <Property Name="FirstName" Type="String" MaxLength="50"
              Unicode="true" FixedLength="false" />
          <Property Name="Alias" Type="String" Nullable="false"
              MaxLength="50" Unicode="true" FixedLength="false" />
          <Property Name="Email" Type="String" MaxLength="50"
              Unicode="true" FixedLength="false" />
          <NavigationProperty Name="References"
 Relationship="HRSkillsModel.Reference_Employee" FromRole="Employees"
             ToRole="References" />
          <NavigationProperty Name="Skills"
  Relationship="HRSkillsModel.Skill_Employee" FromRole="Employees"
            ToRole="Skills" />
        </EntityType>
        <EntityType Name="References">
          <Key>
            <PropertyRef Name="ReferenceId" />
          </Key>
          <Property Name="ReferenceId" Type="Guid" Nullable="false" />
          <Property Name="LastName" Type="String" Nullable="false"
               MaxLength="50" Unicode="true" FixedLength="false" />
          <Property Name="FirstName" Type="String" MaxLength="50"
              Unicode="true" FixedLength="false" />
          <Property Name="Position" Type="String" MaxLength="50"
             Unicode="true" FixedLength="false" />
          <Property Name="Alias" Type="String" Nullable="false"
             MaxLength="50" Unicode="true" FixedLength="false" />
          <Property Name="Email" Type="String" MaxLength="50"
             Unicode="true" FixedLength="false" />
          <NavigationProperty Name="Employees"
 Relationship="HRSkillsModel.Reference_Employee" FromRole="References"
            ToRole="Employees" />
        </EntityType>
        <EntityType Name="SkillInfo">
          <Key>
            <PropertyRef Name="SkillInfoId" />
          </Key>
          <Property Name="SkillInfoId" Type="Guid" Nullable="false" />
          <Property Name="URL" Type="String" Nullable="false"
              MaxLength="250" Unicode="true" FixedLength="false" />
          <NavigationProperty Name="Skills"
  Relationship="HRSkillsModel.SkillInfo_Skill" FromRole="SkillInfo"
           ToRole="Skills" />
        </EntityType>
        <EntityType Name="Skills">
          <Key>
            <PropertyRef Name="SkillId" />
          </Key>
          <Property Name="SkillId" Type="Guid" Nullable="false" />
          <Property Name="SkillName" Type="String" Nullable="false"
             MaxLength="50" Unicode="true" FixedLength="false" />
          <Property Name="BriefDescription" Type="String"
 Nullable="false" MaxLength="Max" Unicode="true" FixedLength="false" />
          <NavigationProperty Name="Employees"
        Relationship="HRSkillsModel.Skill_Employee" FromRole="Skills"
          ToRole="Employees" />
          <NavigationProperty Name="SkillInfo"
 Relationship="HRSkillsModel.SkillInfo_Skill" FromRole="Skills"
            ToRole="SkillInfo" />
        </EntityType>
        <Association Name="Reference_Employee">
          <End Role="Employees" Type="HRSkillsModel.Employees"
                  Multiplicity="1" />
          <End Role="References" Type="HRSkillsModel.References"
                  Multiplicity="*" />
        </Association>
        <Association Name="Skill_Employee">
          <End Role="Employees" Type="HRSkillsModel.Employees"
               Multiplicity="1" />
          <End Role="Skills" Type="HRSkillsModel.Skills"
               Multiplicity="*" />
        </Association>
        <Association Name="SkillInfo_Skill">
          <End Role="Skills" Type="HRSkillsModel.Skills"
               Multiplicity="1" />
          <End Role="SkillInfo" Type="HRSkillsModel.SkillInfo"
               Multiplicity="*" />
        </Association>
      </Schema>
此架构中定义的实体和关联需要一个数据库实现,以在此模型中保存数据。有关存储元数据规范,请参见HR 技能存储元数据(EDM 示例应用程序)。
本节中概念架构的实体和关联使用存储架构将可编程类型连接到为此应用程序保存数据的数据库。有关本节的概念架构与存储元数据之间映射到更多信息,请参见HR 技能映射规范(EDM 示例应用程序)。
另请参见
任务
如何:使用 EdmGen.exe 生成实体数据模型(实体框架)