2013-06-18 92 views
0

從這question我們已經實現了與相應屬性的ColumnAttribute關聯,但是當Linq to SQL嘗試將此屬性映射到Column時,它不起作用。如何添加屬性級別屬性以在運行時映射ColumnAttribute?

我們的財產和映射代碼(從其它問題):

public System.Xml.Linq.XElement Name { 
     get { 
      return this.name; 
     } 
     set { 
      this.OnNameChanging(value); 
      this.SendPropertyChanging(); 
      this.name = value; 
      this.SendPropertyChanged("Name"); 
      this.OnNameChanged(); 
     } 
    } 

     System.Data.Linq.Mapping.ColumnAttribute columnAttribute = new System.Data.Linq.Mapping.ColumnAttribute(); 
     columnAttribute.Name = "Name"; 
     columnAttribute.Storage = "name"; 
     columnAttribute.DbType = "Xml NOT NULL"; 
     columnAttribute.CanBeNull = false; 
     columnAttribute.UpdateCheck = System.Data.Linq.Mapping.UpdateCheck.Never; 

     PropertyOverridingTypeDescriptor propertyOverrideTypeDescriptor = new PropertyOverridingTypeDescriptor(TypeDescriptor.GetProvider(typeof(ClassToMap)).GetTypeDescriptor(typeof(ClassToMap))); 
     PropertyDescriptor pd = TypeDescriptor.GetProperties(typeof(ClassToMap)).Cast<PropertyDescriptor>().ToArray().Where(prop => prop.Name == "Name").FirstOrDefault(); 

     PropertyDescriptor pd2 = TypeDescriptor.CreateProperty(
      typeof(ClassToMap).GetType(), 
      pd, // base property descriptor to which we want to add attributes 
      // The PropertyDescriptor which we'll get will just wrap that 
      // base one returning attributes we need. 
      columnAttribute 
      // this method really can take as many attributes as you like, not just one 
     ); 

     propertyOverrideTypeDescriptor.OverrideProperty(pd2); 
     TypeDescriptor.AddProvider(new TypeDescriptorOverridingProvider(typeof(ClassToMap)), typeof(ClassToMap)); 

任何想法如何刷新表映射?

+0

我已經試過這其他替代http://stackoverflow.com/questions/393687/how-can-i-add-該解決方案在這裏詳細描述了my-attributes-code-generated-linq2sql-classes-properties但仍然不起作用。 – lorddarkangel

回答

0

反射不使用類型描述符。您的測試可能因爲另一個屬性被添加到代碼中的類中而傳遞。

有一種方法可以即時更改LINQ to SQL類映射。訣竅是將XML映射文件添加到資源並在創建數據上下文時使用它。將XML數據加載到內存中時,可以根據需要修改映射。 Linq to sql using dynamic tables

的代碼片段:

foreach (XElement col in xe.Descendants().Where(e => e.Name.LocalName == "Column")) { 
    XAttribute name = col.Attributes().FirstOrDefault(a => a.Name.LocalName == "Name" && a.Value == "CategoryName"); 
    if (name != null) 
     name.Value = "Name"; 
} 
+0

該示例顯示如何更改數據庫或表的名稱。我需要添加一個ColumnAttribute。我不知道如何用xml映射來做到這一點。任何想法? – lorddarkangel

+0

該示例演示了一種常規方法。如果您查看XML文件,您將看到列屬性以這種方式定義: 通過Name屬性定義到數據庫字段的映射。 – Uranus

+0

我已添加名稱屬性,但仍無法使用。我的房產名稱是Name。我忘記了什麼嗎? – lorddarkangel

相關問題