走进Linq-Linq to SQL How do I(3)
[2] 走进Linq-Linq to SQL How do I(3)
[3] 走进Linq-Linq to SQL How do I(3)
[4] 走进Linq-Linq to SQL How do I(3)
[5] 走进Linq-Linq to SQL How do I(3)
系列文章导航:
不能不说的C#特性-迭代器(下),yield以及流的延迟计算
走进Linq-Linq to SQL How do I(1)
走进Linq-Linq to SQL How do I(2)
走进Linq-Linq to SQL How do I(3)
走进Linq-Linq to SQL源代码赏析 Table
走进Linq-Linq to SQL源代码赏析之Provider的初始化
走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq
CanBeNull
这个属性可以指定对应的数据库表的列是否允许是null的,如果这个列不能为null,那你给这个属性赋个null的时候,是要触发异常的。不过要记住,null并不代表是一个空字符串或者零,关于null的更多内容,你可以参见园子Anytao的佳作。
DbType
如果你想使用DataContext的CreateDataBase方法从映射类创建数据库表,那么最好指定这个,这样你就可以明确的指定出你的这个列在数据库表中的DbType是啥,不然Linq to SQL会从属性的类型推断DbType,这有可能不怎么适合,比如这个string类型:
[Column(DbType="NVarchar(50) not null")] public string Title { get; set; }
在这里我们是不是发现了,我们还可以从映射类创建数据库,都说ORM是以O为主,可我们实践的时候总是先建立数据库,然后根据数据库创建Object,那这不是ROM了么,从这里的信息表示,你可以先设计好Domain Object,并建立好Object之间的关系,最后使用CreateDataBase方法来创建数据库表。关于CreateDataBase更多的信息在后面我会更进一步的说明的。
Expression
我只能说Linq to SQL做的太周到了,连这个都考虑了。Expression用来表示一个计算列,什么意思?意思是这个属性是数据库表的列通过计算获取的,比如,假如我们数据库里有一列price存储的是美元,可是取出来的时候我们要求用人民币表示:
[Column(Expression="price * 6")] public float Price { get; set; }
上面的例子只是用来说明Expression这个属性的用途,而这个例子的做法实在是不可取,对于美元转人民币这种汇率问题,汇率是时刻波动的,所以这样硬编码,实在是糟糕的很,各位读了以后BS一下,一笑而过吧。
IsDbGenerated
从名字上就可以看出来了,这个表明这个属性的值是数据库产生的,不需要我们的程序赋值,比如这个自增的列,比如这个有默认值的列(时间,我们可以用SQL getdate()函数设置值,而无需我们在程序里指定)
IsPrimaryKey
是主键吗?如果是就要指定这个属性了,如果你的主键是多个列组成的,那么就在多个属性上加吧。关于主键,在后面还会进一步介绍。
IsVersion和UpdateCheck
这两个在这里就不说了,后面会有大篇幅的介绍的。 这个Column特性是从抽象特性Data继承来的,从这个特性继承了两个属性:
Name
这个是当你的属性名字和这个列名不一致的时候指定列名用的。
Storage
有的时候啊,你的属性里的set里面应用了复杂的业务逻辑,而Linq to SQL在将值从数据库取出,然后赋值给这个属性的时候,默认是要使用这个set的,这个时候在这种情况下(从数据库取值赋给类的属性),你并不想执行这个set里面的逻辑,想把这个值直接给属性背后的那个私有字段:
private float _price;
/// <summary>
/// 由于某些原因,当从数据库取值给Price属性的时候
/// 你不想给这个值乘以20
/// </summary>
[Column(Storage="_price")]
public float Price
{
get { return _price; }
set{_price = _price * 20;
}