微软现在虽然主推EF(Entity Framework)了,但也提供了Linq to EF的实现,Linq在微软的框架中还是一个比较强大的实现。曾经的Linq to SQL由于仅提供了SQL Server的OR实现,受到广大的诟病。后来开源社区也提供了Linq to XXX,来支持各种数据的Linq实现。
今天讨论的是ColumnAttribute中的Expression属性,开始我创建好表,在某一个列的ColumnAttribute中添加Expression,让它在原有值上加1,发现最终的结果并没有实现值加1。
通过仔细查看官方文档,发现Expression属性仅在创建数据库时生效,也就是说这个属性会创建一个新的计算列,如果按照官方的例子,在UnitPrice上执行加1是不能成功的,这相当于有一个例是UnitPrice,还要创建一个计算列是UnitPrice+1,列名还为UnitPrice。这就违反数据库创建表的列名必须唯一的原则。
所以真正有效的例子如下:
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "_UnitPrice", DbType = "Money")]
public System.Nullable<decimal> UnitPrice
{
get
{
return this._UnitPrice;
}
set
{
if ((this._UnitPrice != value))
{
this.OnUnitPriceChanging(value);
this.SendPropertyChanging();
this._UnitPrice = value;
this.SendPropertyChanged("UnitPrice");
this.OnUnitPriceChanged();
}
}
}
[Column(Storage = "_NewUnitPrice", DbType = "Money", Expression = "UnitPrice + 2.00")]
public decimal? NewUnitPrice
{
get { return _NewUnitPrice; }
set { _NewUnitPrice = value; }
}
其中的NewUnitPrice是我们要创建的新单价的计算列。然后在使用时如果数据库存在先删除,再创建,代码如下:
ProductClassDataContext pcdc = new ProductClassDataContext(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=D:\demo.mdf;Integrated Security=True;Connect Timeout=30");
if (pcdc.DatabaseExists())
{
pcdc.DeleteDatabase();
}
pcdc.CreateDatabase();
当然删除操作完善点应该是在首次运行时。否则每次都删除的话原来的数据都没有了。
当创建好数据库后,使用VS查看表,发现NewUnitPrice的图标都是计算列图标。如下图: