代码改变世界

Linq to SQL T4 代码生成器 (三)访问设计器中的 Column 对象

2010-07-24 14:01  麦舒  阅读(1715)  评论(2编辑  收藏  举报

上一篇文章给大家介绍了Linq to SQL 设计器中 Table 对象的访问,本文主要介绍一下 Linq to SQL 设计器中 Column 对象的访问,要生成实体类的属性,必须通过访问 Column 对象。下面来看代码:

 

<#@ template inherits="ModelingTextTransformation" language="C#" debug="true" hostspecific="True"#>
<#@ QuickCode processor="DbmlProcessor" requires="ModelFile='Northwind.dbml'"#>
<#@ output extension=".cs" #>
<#@ import namespace = "System.Text.RegularExpressions" #>

using System.Data.Linq;
using System.Data.Linq.Mapping;

namespace <#= DataContext.ContextNamespace #>
{
<# foreach(ITable table in DataContext.Tables){ #>
[Table(Name
="<#= table.Name #>")]
public class <#= table.Type.Name #>
{
<# foreach(IColumn column in table.Type.Columns){#>
[Column(Name
="<#= column.Name #>", UpdateCheck="<#= column.UpdateCheck #>")]
public <#= column.Type #> <#= column.Member #>
{
get;
set;
}
<#} #>
}
<# } #>

}

 

 

生成代码如下:

 

代码

using System.Data.Linq;
using System.Data.Linq.Mapping;

namespace DecodeDemo
{
[Table(Name
="dbo.Categories")]
public class Category
{
[Column(Name
="CategoryID", UpdateCheck="Never")]
public System.Int32 CategoryID
{
get;
set;
}
[Column(Name
="CategoryName", UpdateCheck="Never")]
public System.String CategoryName
{
get;
set;
}
[Column(Name
="Description", UpdateCheck="Never")]
public System.String Description
{
get;
set;
}
[Column(Name
="Picture", UpdateCheck="Never")]
public System.Data.Linq.Binary Picture
{
get;
set;
}
}

}

 

 

 

我们要注意的是这一句:

 

<# foreach(IColumn column in table.Type.Columns){#>

 

 

很多朋友可能会有疑问,怎么 Columns 放在 Type 对象里,而不是 table 对象中呢?可能这样理解,在 Linq to SQL 设计器中,具有继承关系的多个类,都城是映射到同一个表的。也就是说,一个表 (ITable) 可以对应多个类 (IType),而每个类,都包含有一个或都多个列(IColumn)。也就是说,你通过 IType.Columns 访问到的列,不是表所包含的全部列,而只是一部份映到类属性的列(如果该类没有继承类则为全部)。

 

IColumn 的成员如下图所示,这些成员名称,使用过 Linq to SQL 的朋友都熟悉了,因此也不打算解释了。如果有任何疑问,请给我留言。完整的属性列表请点击:

http://www.alinq.org/document/decode.htm

 

完整代码以及示例请到本系列的第一篇文章那里下载:http://www.cnblogs.com/ansiboy/archive/2010/07/22/1782982.html