Linq to SQL中的ColumnAttribute中的Expression

微软现在虽然主推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的图标都是计算列图标。如下图:
Linq to SQL中的ColumnAttribute中的Expression

上一篇:系统启动报错


下一篇:新版阿里云控制台远程连接使用简介