5

Entity Framework 매핑에서 테이블을 참조하는 모든 외래 키를 찾기 위해 리플렉션을 사용하고 싶은데 어려움이 있습니다. 열의 이름을 원합니다. 그것들은 외래 키들입니다.엔티티 프레임 워크 - 외래 키 및 관계/연관성 반영

another post on SO에 따르면 리플렉션을 통해 표에서 탐색 속성을 쉽게 찾을 수 있습니다. 그러나 이것은 외래 키 값을 포함하는 속성 또는 열의 이름을 나에게주지 않습니다.

내가 이것을하려고하는 이유는 하나의 항목 테이블을 참조하는 많은 테이블 (거의 40 개)을 가지고 있기 때문입니다. 사용자가 "Andew"라고하는 항목 테이블에 새 값을 입력하면 관리자는 실제로 기존 항목 "Andrew"에 대한 오타가 있음을 알게됩니다. 이제 "Andew"에 대한 모든 참조를 찾고 Andrew에 대한 참조를 변경하려고합니다. 나는 이것을 효과적으로 수행하는 것을 선호 할 것입니다. 따라서 역 네비게이션 속성을 사용하는 것은 값을 수정하기 전에 값을로드해야하므로 너무 느립니다. 내가하고 싶은 것은 테이블과 열의 목록을 반영한 다음 데이터베이스에 직접 업데이트 명령을 내릴 수 있습니다. 그것은 다음과 같이 보일 것입니다 :

LINQ에서
var command = String.Format("UPDATE [{0}] SET [{1}] = {{1}} WHERE [{1}] = {{0}}; ", fk.FromTableName, fk.FromColumnName); 
dataContext.ExecuteStoreCommand(command, new Object[] { oldID, newID }); 

는 LINQ 자동 생성 된 코드에 ... 이것은 실제로 매우 쉬웠다 반사의 20 개 라인을 SQL로 내가 이루어졌다, 그러나 우리는 최근 EF 전환 및 I EF를 통해 외래 키 열의 이름을 찾을 수 없습니다.

간략한 예제 : Manager라는 내비게이션 속성과 ManagerID의 외래 키가있는 Employee라는 개체가있는 경우 Manager가 내 탐색 속성 및 기본 저장소임을 알고 싶습니다. ManagerID 속성입니다. 리플렉션 또는 메타 데이터를 통해이 작업을 엄격하게 수행하고 싶으므로 여기에서 dynmaic 쿼리를 작성할 수 있습니다. 당신은 당신이 관심있는 EntityType에 도착 링크 된 문제의 아이디어를 사용하면

+1

당신은 아래 표를 얻었으므로 나는 당신이 겪고있는 것을 이해하는 데 어려움을 겪고있는 유일한 사람이 아니라고 생각합니다. 'employee.managerId' 또는'employee.manager.id'를 할 수 있습니까? 당신은 컨벤션이 무엇인지 알 필요가 있습니다. DBA는 단순히 다른 방식으로 프로젝트에 영향을주지 않으면 서 DB를 간단히 변경할 수 없습니다. – Eonasdan

+0

@ Eonasdan - 감사합니다. 왜 내가 downvoted되었는지 궁금 해서요. 나는 그것을 훨씬 더 명확하게하기 위해 전적으로 재 작성했다. 불행히도 이제는 훨씬 더 길어지고, 나는 그것을 짧게하려고 노력하고있었습니다. – pbarranis

답변

1

는주의 그에 참여하는 모든 EdmMembers의 집합 인 속성 KeyMembers을 가지고 EntityTypeBase에서 EntityType 상속 엔티티의 키.

EdmMember에는 Name이 있으며, 이는 "ManagerID" 문자열입니다.

+1

좋은 생각인데, 현재 외부 객체의 키가 아닌 현재 객체의 외부 키 이름을 가져와야합니다. myObject.ManagerID와 myObject.Manager.ID 사이의 차이점입니다. 우리는 Manager.ID의 관습을 사용하지 않습니다. 우리는 Manager.ID를 사용합니다. 그래서 각 끝마다 열의 이름이 다르게 지정됩니다. – pbarranis

1

단지 시간을 절약하기 위해 이 아닌이 올바른 답이지만, SQL에서 시스템보기를 통해 묻는 것은 할 수 있습니다. 나는 이것을 시도하고 작동하지만 LINQ to SQL을 통해이 데이터를 쉽게 얻을 수 있지만 EF에서는 찾을 수 없다. 대안이 없다면 아래의 솔루션을 사용해야 할 것입니다. (그러나 EF 난 그냥 여기에 액세스하려는 ... 내부 어딘가에이 데이터를 가지고있다.)

select K.name as RelationshipName, T1.name as FromTable, C1.name as FromColumn, T2.name as ToTable, C2.name as ToColumn 
from sys.foreign_keys as K 
join sys.foreign_key_columns as C on K.object_id = C.constraint_object_id 
join sys.columns as C1 on K.parent_object_id = C1.object_id 
join sys.tables as T1 on K.parent_object_id = T1.object_id 
join sys.columns as C2 on K.referenced_object_id = C2.object_id 
join sys.tables as T2 on K.referenced_object_id = T2.object_id 
where C1.column_id = C.parent_column_id 
and C2.column_id = C.referenced_column_id 
and T2.Name = 'Employee' 
order by T1.Name, C1.Name 

는 희망 단지 참고로,도 (...이 잘못된 대답은 적어도 유용 나보다 다른 사람이하는 것입니다 게시 이 솔루션은 다중 열 PK로 작업하는 데 훨씬 많은 코드가 필요합니다. 즉, 모든 열은 단일 열입니다.

관련 문제