2013-12-10 103 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