综合应用WPF/WCF/WF/LINQ之十二:LINQ的ORM功能中对自定义的Entity Class的支持

简介:
首先,我们使用SqlMetal.exe程序从DBML文件生成Mapping程序:
    1 SqlMetal.exe /code:"..\Eallies.OA.DAL.DBML\Database.cs" "..\Eallies.OA.DAL.DBML\Database.dbml"
  我们查看生成的Database.cs文件,发现关于存储过程GetEmployeeByEmployeeId的代码如下:
    1         [ Function(Name= "dbo.GetEmployeeByEmployeeId")]
    2          public  ISingleResult< GetEmployeeByEmployeeIdResult> GetEmployeeByEmployeeId([ Parameter(Name= "EmployeeId", DbType= "Int")] System. Nullable< int> employeeId)
    3         {
    4              IExecuteResult result =  this.ExecuteMethodCall( this, (( MethodInfo)( MethodInfo.GetCurrentMethod())), employeeId);
    5              return (( ISingleResult< GetEmployeeByEmployeeIdResult>)(result.ReturnValue));
    6         }
  显然,LINQ认为该存储过程返回的结果的Entity Class为GetEmployeeByEmployeeIdResult,但这却不是我们所期望的,实际上我们已经定义了Info类用于保存返回的结果:
    1  using System;
    2  using System.Collections;
    3  using System.Collections.Generic;
    4  using System.Linq;
    5  using System.Text;
    6  using System.Runtime.Serialization;
    7  using System.Data.Linq;
    8  using System.Data.Linq.Mapping;
    9  using Eallies.OA.Info.Enum;
   10 
   11  namespace Eallies.OA.Info
   12 {
   13     [ DataContract]
   14     [ Serializable]
   15      public  class  EmployeeInfo
   16     {
   17          private  Int32 _EmployeeId;
   18          private  String _EmployeeNo;
   19          private  String _EmployeeName;
   20          private  Int32 _DepartmentId;
   21          private  Int32 _PositionId;
   22          private  Nullable< Int32> _EmployeeManager;
   23          private  Boolean _EmployeeGender;
   24          private  DateTime _EmployeeEntryDate;
   25          private  Nullable< DateTime> _EmoplyeeBirthday;
   26          private  String _EmployeePhone;
   27          private  String _EmployeeEmail;
   28          private  EmployeeStatusEnum _EmployeeStatus;
   29 
   30         [ DataMember]
   31         [ Column(Storage =  "_EmployeeId", DbType =  "Int NOT NULL", CanBeNull =  false)]
   32          public  Int32 EmployeeId
   33         {
   34              get {  return  this._EmployeeId; }
   35              set {  this._EmployeeId =  value; }
   36         }
   37 
   38         [ DataMember]
   39         [ Column(Storage =  "_EmployeeNo", DbType =  "NVarChar(50) NOT NULL", CanBeNull =  false)]
   40          public  String EmployeeNo
   41         {
   42              get {  return  this._EmployeeNo; }
   43              set {  this._EmployeeNo =  value; }
   44         }
   45 
   46         [ DataMember]
   47         [ Column(Storage =  "_EmployeeName", DbType =  "NVarChar(50) NOT NULL", CanBeNull =  false)]
   48          public  String EmployeeName
   49         {
   50              get {  return  this._EmployeeName; }
   51              set {  this._EmployeeName =  value; }
   52         }
   53 
   54         [ DataMember]
   55         [ Column(Storage =  "_DepartmentId", DbType =  "Int NOT NULL", CanBeNull =  false)]
   56          public  Int32 DepartmentId
   57         {
   58              get {  return  this._DepartmentId; }
   59              set {  this._DepartmentId =  value; }
   60         }
   61 
   62         [ DataMember]
   63         [ Column(Storage =  "_PositionId", DbType =  "Int NOT NULL", CanBeNull =  false)]
   64          public  Int32 PositionId
   65         {
   66              get {  return  this._PositionId; }
   67              set {  this._PositionId =  value; }
   68         }
   69 
   70         [ DataMember]
   71         [ Column(Storage =  "_EmployeeManager", DbType =  "Int", CanBeNull =  true)]
   72          public  Nullable< Int32> EmployeeManager
   73         {
   74              get {  return  this._EmployeeManager; }
   75              set {  this._EmployeeManager =  value; }
   76         }
   77 
   78         [ DataMember]
   79         [ Column(Storage =  "_EmployeeGender", DbType =  "Bit NOT NULL", CanBeNull =  false)]
   80          public  Boolean EmployeeGender
   81         {
   82              get {  return  this._EmployeeGender; }
   83              set {  this._EmployeeGender =  value; }
   84         }
   85 
   86         [ DataMember]
   87         [ Column(Storage =  "_EmployeeEntryDate", DbType =  "DateTime NOT NULL", CanBeNull =  false)]
   88          public  DateTime EmployeeEntryDate
   89         {
   90              get {  return  this._EmployeeEntryDate; }
   91              set {  this._EmployeeEntryDate =  value; }
   92         }
   93 
   94         [ DataMember]
   95         [ Column(Storage =  "_EmoplyeeBirthday", DbType =  "DateTime", CanBeNull =  true)]
   96          public  Nullable< DateTime> EmoplyeeBirthday
   97         {
   98              get {  return  this._EmoplyeeBirthday; }
   99              set {  this._EmoplyeeBirthday =  value; }
  100         }
  101 
  102         [ DataMember]
  103         [ Column(Storage =  "_EmployeePhone", DbType =  "NVarChar(50)", CanBeNull =  true)]
  104          public  String EmployeePhone
  105         {
  106              get {  return  this._EmployeePhone; }
  107              set {  this._EmployeePhone =  value; }
  108         }
  109 
  110         [ DataMember]
  111         [ Column(Storage =  "_EmployeeEmail", DbType =  "NVarChar(50)", CanBeNull =  true)]
  112          public  String EmployeeEmail
  113         {
  114              get {  return  this._EmployeeEmail; }
  115              set {  this._EmployeeEmail =  value; }
  116         }
  117 
  118         [ DataMember]
  119         [ Column(Storage =  "_EmployeeStatus", DbType =  "Int NOT NULL", CanBeNull =  false)]
  120          public  EmployeeStatusEnum EmployeeStatus
  121         {
  122              get {  return  this._EmployeeStatus; }
  123              set {  this._EmployeeStatus =  value; }
  124         }
  125     }
  126 }
  这时,我们也可以手动或者采用程序将GetEmployeeByEmployeeIdResult改成EmployeeInfo,幸运的是,LINQ也能正确的识别我们的这种更改。然后,我们就可以将LINQ自动生成的GetEmployeeByEmployeeIdResult类彻底删除了。
  值得注意的是:由于Info类是应用于整个系统各个环节的,所以它有一些特别的定义。
  我们注意到这个类加了DataContract之类的标志,这是用于WCF技术的;它还加了Serializable标志,这是用于WF技术的,在将Workflow实例持久化到数据库中时,要求这个类可序列化;另外,它还加了Column标志,这是用于LINQ技术的。




本文转自 Eallies 51CTO博客,原文链接:http://blog.51cto.com/eallies/79031,如需转载请自行联系原作者

目录
相关文章
|
3月前
|
C# 机器学习/深度学习 搜索推荐
WPF与机器学习的完美邂逅:手把手教你打造一个具有智能推荐功能的现代桌面应用——从理论到实践的全方位指南,让你的应用瞬间变得高大上且智能无比
【8月更文挑战第31天】本文详细介绍如何在Windows Presentation Foundation(WPF)应用中集成机器学习功能,以开发具备智能化特性的桌面应用。通过使用Microsoft的ML.NET框架,本文演示了从安装NuGet包、准备数据集、训练推荐系统模型到最终将模型集成到WPF应用中的全过程。具体示例代码展示了如何基于用户行为数据训练模型,并实现实时推荐功能。这为WPF开发者提供了宝贵的实践指导。
43 0
|
3月前
|
开发者 C# UED
WPF与多媒体:解锁音频视频播放新姿势——从界面设计到代码实践,全方位教你如何在WPF应用中集成流畅的多媒体功能
【8月更文挑战第31天】本文以随笔形式介绍了如何在WPF应用中集成音频和视频播放功能。通过使用MediaElement控件,开发者能轻松创建多媒体应用程序。文章详细展示了从创建WPF项目到设计UI及实现媒体控制逻辑的过程,并提供了完整的示例代码。此外,还介绍了如何添加进度条等额外功能以增强用户体验。希望本文能为WPF开发者提供实用的技术指导与灵感。
144 0
|
3月前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
61 0
|
3月前
|
API C# Shell
WPF与Windows Shell完美融合:深入解析文件系统操作技巧——从基本文件管理到高级Shell功能调用,全面掌握WPF中的文件处理艺术
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的关键组件,用于构建 Windows 桌面应用程序。WPF 提供了丰富的功能来创建美观且功能强大的用户界面。本文通过问题解答的形式,探讨了如何在 WPF 应用中集成 Windows Shell 功能,并通过具体示例代码展示了文件系统的操作方法,包括列出目录下的所有文件、创建和删除文件、移动和复制文件以及打开文件夹或文件等。
76 0
|
3月前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
107 0
|
3月前
|
前端开发 C# 容器
WPF/C#:实现导航功能
WPF/C#:实现导航功能
70 0
|
开发框架 前端开发 JavaScript
WPF+ASP.NET SignalR实现简易在线聊天功能
WPF+ASP.NET SignalR实现简易在线聊天功能
210 0
|
自然语言处理 编译器 C#
【WPF】实现动态切换语言(国际化)以及动态换肤功能
以下内容,手把手从搭建到最终实现,完成多语言切换以及换装功能。
447 0
【WPF】实现动态切换语言(国际化)以及动态换肤功能
|
前端开发 C# 图形学
【WPF】WPF开发用户控件、用户控件属性依赖DependencyProperty实现双向绑定、以及自定义实现Command双向绑定功能演示
Wpf开发过程中,最经常使用的功能之一,就是用户控件(UserControl)了。用户控件可以用于开发用户自己的控件进行使用,甚至可以用于打造一套属于自己的UI框架。依赖属性(DependencyProperty)是为用户控件提供可支持双向绑定的必备技巧之一,同样用处也非常广泛。
944 0
【WPF】WPF开发用户控件、用户控件属性依赖DependencyProperty实现双向绑定、以及自定义实现Command双向绑定功能演示
|
XML Java 程序员
WPF使用AvalonEdit实现代码高亮显示、搜索、替换功能
很多工程软件拥有自己定义的脚本语言,作为程序员用惯了具有高亮显示和智能提示功能的编辑器,所以针对特定的脚本自己开发一个编辑器。主要采用WPF、C#语言以及AvalonEdit控件。
WPF使用AvalonEdit实现代码高亮显示、搜索、替换功能