Linq to SQL T4 代码生成器 (四)访问设计器中的 Association 对象
2010-07-26 10:20 麦舒 阅读(1898) 评论(7) 编辑 收藏 举报
要访问设计器中 Association 对象,需要通过 IType.Association 属性进行访问的。而生成 Association 的代码,也比较啰嗦,因此在这里只是把一些要点写出来,并不是完整的代码。完整的代码请参我在第一篇文章所提供的示例。
在从 Northwind 数据库中,拖 Categores 和 Products 两个表到设计器中。如下载所示:
先来看一下一段简单的模版代码,当然,这段模版代码代仅用来演示。
<#@ 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 partial class <#= table.Type.Name #>
{
<# foreach(IAssociation association in table.Type.Associations){ #>
[Association(ThisKey="<#= String.Join(",",association.ThisKey) #>", OtherKey="<#= String.Join(",",association.OtherKey) #>")]
<# if(association.Cardinality == Cardinality.One) {#>
public <#= association.Type #> <#= association.Member #>
{
get;
set;
}
<# }else{ #>
public EntitySet<<#= association.Type #>> <#= association.Member #>
{
get;
set;
}
<# } #>
<# } #>
}
<# } #>
}
生成的代码如下:
using System.Data.Linq;
using System.Data.Linq.Mapping;
namespace DecodeDemo
{
[Table(Name="dbo.Categories")]
public partial class Category
{
[Association(ThisKey="", OtherKey="CategoryID")]
public EntitySet<Product> Products
{
get;
set;
}
}
[Table(Name="dbo.Products")]
public partial class Product
{
[Association(ThisKey="CategoryID", OtherKey="")]
public Category Category
{
get;
set;
}
}
}
有几个属性解释一下:
association.Type 表示的是 Association 目标对象的类型(也就是 Association 的另一端)
就拿来本文中的例子来,当然 Category 实体类来说,它的 association.Type 为 Product 类型,而 Product 实体类的 association.Type 则为 Category。
association.Cardinality 表示另一端是的对象是一个或者多个,也就是一对一、还是一对多的关系。
association.Cardinality == Cardinality.One 表示是一对一
association.Cardinality == Cardinality.Many 表示一对多。
association.ThisKey 、association.OtherKey 表示的是主键和连接的外键,而且它们都是字符串数组,所以生成代码的时候要用 String.Join 方法。
association.Member 表示 Association 所在类中的成员名称。
完整的成员请访问:http://www.alinq.org/document/decode.htm#IAssociation
关于 Association 对象的访问就到此为止了,如有任何疑问,可以给我留言。
预告:
接下来可能会写的内容是:
1、单模版生多文件。(现在生成的都是一个文件)
2、给大家介绍一个新的 Linq to SQL 设计器,当然,我所提供的设计器是在原在的基础上进行改进的。
3、存储过程的代码生成。(可能不写,因为很少有人需要自定义存储过程的生成代码)
4、生成 NHiberate 代码。NHibernate 最缺乏的就是一个良好的设计器,相信有不少使用 NHibernate 的朋友会感兴趣的。