2013-06-18 3 views
0

question에서 해당 속성과 함께 ColumnAttribute 연결을 구현했지만 Linq에서 SQL로이 속성을 열에 매핑하려고하면 작동하지 않습니다. 런타임에 ColumnAttribute를 매핑하기 위해 속성 수준 Attribute를 추가하는 방법은 무엇입니까?

우리의 재산과 (다른 질문에서) 매핑 코드 : 어떻게 테이블 매핑을 새로 고치려면

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-to-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