2013-12-10 102 views
1

我有一個應用程序使用Linq to SQL來獲取數據並將數據存儲到數據庫。我有一個電話號碼字段。我試圖只將數字一直存儲爲數字,而不是其他數字。要做到這一點,我有兩個我已經添加到字符串的擴展方法。 ToPhoneFormat()按照用戶需要格式化手機數字,如「(xxx)xxx-xxxx」或「xxx.xxx.xxxx」。 ToPhoneStorage()刪除所有格式並只保存數字中用於數據庫的數字。Linq to SQL存儲屬性問題

下面是與LINQ的使用SQL代碼示例:

private string homePhone; 
    [Column(CanBeNull = true, DbType = "nvarchar(25)", Name = "HOME_PHONE_NUM", Storage = "homePhone")] 
    [Display(Name = "Home Phone")] 
    public string HomePhone { 
    get { return homePhone.ToPhoneFormat(); } 
    set { homePhone = value.ToPhoneStorage(); } 
    } 

當我提交使用DataContext的變化,LINQ的事實上確實來電來訪,吸氣,和格式化手機被髮送回數據庫。我不正確理解Storage屬性嗎?似乎它應該像這樣正確工作。

當然,我可以創建兩個字段「PhoneDigits」和「PhoneFormatted」,並且只將列屬性提供給「Phone」字段。所以我知道有一個工作。但是如果不這樣做,Storage屬性會做什麼?

回答

1

ColumnAttributeStorage屬性告訴Linq-to_Sql使用私有字段homePhone來獲取和設置屬性的值。所以實際的吸氣和呼吸機被繞過。

您可以刪除Storage屬性分配。代碼看起來不像生成的dbml的一部分,所以不會被覆蓋。另一方面,我不認爲linq-to-sql能夠在setter中沒有常規管道代碼(SendPropertyChanged等)的情況下跟蹤對屬性的更改。如果您手動添加此代碼,它也會在對象從數據庫中物化時觸發,所以它始終在修改後的狀態下開始使用。 (這是通過設置私人成員阻止的)。一個搖滾樂和一個艱難的地方...

+0

我決定創建兩個屬性 - HomePhone和HomePhoneFormatted。 HomePhone直接映射到數據庫字段。 HomePhoneFormatted獲取並設置HomePhone字段,但應用格式化或刪除它,並且不與數據庫相關聯。然後我在數據庫上運行SQL命令以對現有數據進行格式化。謝謝(你的)信息。 – Paul