특별한 포스팅이 아니라 잠깐 고생했었던 이야기를 적어보려고 합니다.

이번 프로젝트에서 엔티티와 리아서비스를 주로 사용하고 있는데요.
리아서비스 편하긴 정말 많이 편하더군요. 
복잡한 쿼리가 아닌 이상은 리아서비스를 + 링크(linq) 를 이용해서 바로바로 처리했었습니다.

거의 대부분 복잡하지가 않아서 무난하게 작업중이였는데요.
오늘 복잡한 부분을 처리해야될 부분이 있어서
프로시저를 사용하게 되었습니다.

하나의 특정한 테이블이 아니라 여러개의 테이블에서 데이터를 가져와서 가공한터라..
기본키가 없었습니다.

그리고 사실 디비를 잘 알지도 못하구요.

프로시저를 추가해주니 엔티티가 자동으로 생기지 않는겁니다. -ㅁ-;
Complex types(으)로 엔터티를 만들어주었습니다.

절차는 아래와 같습니다.


우선 프로시저를 .edmx 파일을 열어서 추가 합니다.


추가한 프로시저를 우클릭하여 "Add function import" 해줍니다.


위와 같은 창이 뜨면 만들어진 entities 를 이용할 수도 있지만 저는 " complex" 를 선택하여 자동으로 만들어 주었습니다.



위와 같이 complex types 폴더에 자동으로 "sp_GetTeachersTimerTable_Result"가 만들어진 모습입니다.
프로시저 이름 + _Result 네요.

이렇게 하구 Domain service에 추가를 해줬습니다.
근데 기존에 Table Entities 와는 다르게 자동으로 코드가 생기지 않더군요.
수동으로 해줘야하는 모양입니다.

        public ObjectResult GetTimeTable(int teacherNo)
        {
            return this.ObjectContext.sp_GetTeachersTimeTable(teacherNo);
        }


그래서 손수 위와 같이 입력을 해주었습니다. 오류가 나더군요.
머 적어도 하나의 기본키는 있어야한다는 내용이였습니다..

select 로 가져온 결과값에 기본키를 지정할 수 있는 방법을 몰랐습니다.
수동으로 complex types entities 를 만져보고 해봤는데도 잘 안되더라구요.

코드단에서 한번 수정을 해보자 싶어서 .edmx.Designer.cs 파일을 열어보았습니다.
자동으로 만들어진 엔터티에 관한 내용들 사이에서 제가 원하던 

public partial class sp_GetTeachersTimeTable_Result : ComplexObject

클래스를 찾았습니다.
그곳에서 제일 만만한 속성을 골라잡아서 강제로 [Key] 를입력해주니깐 바로 해결이 되더군요.

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
        [DataMemberAttribute()]
        [Key]
        public global::System.Int32 sid

        {

                     ...

         }

원래 이렇게 하는건지..
물론 다른 방법이 있겠지만..

어찌되었든 해결이 되어 포스팅 해봅니다.
저작자 표시 비영리 변경 금지
신고