開發與維運

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的圖標都是計算列圖標。如下圖:
2020-03-18_102050.png

Leave a Reply

Your email address will not be published. Required fields are marked *