在Suteki.Shop中Model的原型是基于Linq to SQL创建的,其dbml文件位于Suteki.Shop\Shop.dbml。 而Suteki.Shop在此文件的基本上,以"partial class "的方式在Suteki.Shop\Model文件夹下 创建了相应的类文件以扩展Shop.dbml中Model类的一些方法和属性声明,如下图:
为了便于 大家理解,下面以Model中的Product.cs为例进行说明。
Product是对网站中所销售商品的数据信 息类。在其中定义了一些属性(声明在Shop.dbml中):
private int _ProductId; // 产品ID
private int _CategoryId; //产品所属分类ID
private string _Name; // 产品名称
private string _Description;//产品描述
private decimal _Price; //产 品价格
private int _Position; //在列表中的位置
private int _Weight; //重量
private bool _IsActive; //当前是否激活显示
private string _UrlName; //产品的 URL链接
而Product.cs这个文件其实是以partial方式对Shop.dbml中的Product类的 "扩展",下面是其实现代码:
public partial class Product : IOrderable, IActivatable, IUrlNamed
{
partial void OnNameChanging(string value)
{
value.Label("Name").IsRequired();
}
partial void OnNameChanged ()
{
UrlName = Name.ToUrlFriendly();
}
partial void OnDescriptionChanging(string value)
{
value.Label ("Description").IsRequired();
}
public bool HasMainImage
{
get
{
return this.ProductImages.Count > 0;
}
}
public Image MainImage
{
get
{
if (HasMainImage) return this.ProductImages.InOrder().First().Image;
return null;
}
}
public bool HasSize
{
get
{
return this.Sizes.Active().Count() > 0;
}
}
public Size DefaultSize
{
get
{
if (this.Sizes.Count() == 0) throw new ApplicationException("Product has no default size");
return this.Sizes[0];
}
}
public string IsActiveAsString
{
get
{
if (IsActive) return string.Empty;
return " Not Active";
}
}
public static Product DefaultProduct(int parentCategory, int position)
{
return new Product
{
ProductId = 0,
CategoryId = parentCategory,
Position = position
};
}
}