2013-06-13 2 views
2

모든 멤버 (기본 키 제외)에 대해 UpdateCheck 기능을 해제하고 싶습니다. 이제 아래 예제를 지침으로 사용했지만 표의 MetaDataMembers는 여전히 Always으로 설정되었습니다. 나는 그것을 실행하고 나는 모든 속성이 설정되는 것을 볼 코드를 디버깅 할 수Linq to SQL - 코드에서 UpdateCheck 해제

http://www.the-lazy-coder.com/2013/04/set-updatecheck-to-never.html

위의 코드는 그렇게, 그러나 그것을 집어 만나지 것, 속성을 변경됩니다 변경되는 속성이 기본 객체를 변경하지 않는다고 가정합니다.

접근 방식을 변경하고 RowType에서 MetaDataMembers를 직접 가져온 경우에는 getter만이 UpdateCheck 속성을 갖게됩니다. 그래서 일단 (일단 리플렉션을 통해)이 속성이 설정되면이 속성을 덮어 쓸 수있는 방법이 있습니까? 디 컴파일 된 소스를 살펴본 후에도 추상 클래스이므로 참조 용으로 사용할 구현을 찾을 수 없습니다.

SQLMetal을 사용하여 컨텍스트 파일을 생성하므로 사용 가능한 디자이너가 없기 때문에 일부 사람이 텍스트 편집 매크로를 실행하여 특성을 구문 분석하고 변경해야한다고 말하지만 모두 너무 길게 들립니다. 내가 그냥 메모리에있는 개체로 이동하고 이전에 들었던 무엇이든 무시하도록 말할 수 있어야합니다.

! 엔터티의 속성을 재정의하는 방법이 있습니까? 객체를 생성 한 직후, 그리고 업데이트를하기 직전에 두 생성자의 링크에서 원래 코드를 실행 해 보았습니다. 그러나 변경 사항 중 아무 것도 붙지 않거나 적어도 중요한 부분으로 전파되지는 않습니다. 거의 발생하지 않습니다. 이 모든 것을 프로 그레시 적으로하는 방법에 관한 자료.

답변

2

인터넷을 검색 한 후에는 좋은 방법이 없다는 것을 알았지 만 원래 언급 한 링크가 있지만 부분적으로 옳은 경우 작동하지만 위의 경우 작동합니다. 메모리에없는 그냥 장식, 어쨌든 아래 코드가 작동하는 것 같다하지만있는 속성에 좋은되지 않습니다 :

public static void SetUpdateCheckStatus(this IDataContext dataContext, UpdateCheck updateCheckStatus) 
     { 
      var tables = dataContext.Mapping.GetTables(); 
      foreach (var table in tables) 
      { 
       var dataMembers = table.RowType.DataMembers; 
       foreach (var dataMember in dataMembers) 
       { 
        if (!dataMember.IsPrimaryKey) 
        { 
         var dataMemberType = dataMember.GetType(); 
         if (dataMemberType.Name == "AttributedMetaDataMember") 
         { 
          var underlyingAttributeField = dataMember.GetType().GetField("attrColumn", BindingFlags.Instance | BindingFlags.NonPublic); 
          if (underlyingAttributeField != null) 
          { 
           var underlyingAttribute = underlyingAttributeField.GetValue(dataMember) as ColumnAttribute; 
           if (underlyingAttribute != null) 
           { underlyingAttribute.UpdateCheck = updateCheckStatus; } 
          } 
         } 
         else 
         { 
          var underlyingField = dataMember.Type.GetField("updateCheck", BindingFlags.Instance | BindingFlags.NonPublic); 
          if (underlyingField != null) 
          { underlyingField.SetValue(dataMember, updateCheckStatus); } 
         } 
        } 
       } 
      } 
     } 

IDataContext 우리가 목적을 조롱에 대한 DataContext에 주위를 넣어 단지 래퍼, 그래서 기분이 자유롭게 DataContext로 변경할 수 있습니다. 이 방법은 원하는 모든 데이터를 가지고 있지 않은 멤버를 많이 끌어 오기 때문에 매우 방역 적으로 작성되어 있으므로 필터를 사용하여 수행해야하는 작업 만 수행해야합니다.