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

本文介绍如何使用SqlMetal.exe工具从DBML文件生成Mapping程序,并手动调整存储过程GetEmployeeByEmployeeId的返回类型,使其匹配自定义的EmployeeInfo类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,我们使用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,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值