2009-11-14 4 views
0

LINQ에서 다음과 같은 상황이 있습니다. 다른 값을 가질 수있는 "Status"필드가있는 개체 (블로그 "Post")가 있습니다. 이 모든 값을 나열하는 테이블이 있습니다 (이 테이블에는 Id, Desc가 있습니다).
이제 두 테이블 간의 관계가 만들어 지므로 모델에서 Post.Status는 int가 아니라 "PostStatus"의 인스턴스입니다.LINQ2SQL : 다른 엔터티에 대한 참조가있는 엔터티 필드를 업데이트하십시오.

따라서 게시물의 상태를 20으로 설정하려면 필드를 20으로 설정할 수 없습니다. 할당 할 PostStatus의 인스턴스가 있어야합니다. 이 상태 값은 모두 논리로 하드 코드되어 있으므로 코드에 "20"을 하드 코드하면됩니다.
더 나은 방법이 있나요? 이 불필요하게 PostStatus 인스턴스를 얻을 수있는 DB를 조회하기 때문에

switch (Action) { 
case "Ignore": 
    post.PostStatus = (from s in db.PostStatus where s.Id == 90 select s).First(); 
    break; 
case "Assign": 
    post.PostStatus = (from s in db.PostStatus where s.Id == 20 select s).First(); 
    break; 
case "MarkDone": 
    post.PostStatus = (from s in db.PostStatus where s.Id == 30 select s).First(); 
    break; 
case "MarkPublished": 
    post.PostStatus = (from s in db.PostStatus where s.Id == 40 select s).First(); 
    post.Public = true; 
    break; 
} 

은 내가 먼저 모든, 정직,이 코드를 싫어하지만, 대부분 있기 때문에 너무 자세한입니다.
더 좋은 방법이 있나요?

감사합니다.
다니엘

답변

1

PostStatus가 다소 더 enum 인 것 같습니다. 우리는 DB와 관련있는 테이블을 가지고 있기 때문에 항상 이와 같은 일을하지만 DBML의 관계를 제거하고 하위 열의 CLR 유형을 열거 형으로 변경합니다. enum 유형은 부모 DB 테이블의 행과 동일한 값으로 선언됩니다 (사용자의 경우 Assign = 20, MarkDone = 30 등). 필자는 모든 열거 형의 코드에서 테이블의 값을 채우는 도구를 작성했습니다. 코드가 "마스터"입니다 (누군가가 기존 값의 값이나 이름을 변경하려고 시도하면 폭탄이 떨어지지만 새로운 값은 "작동합니다"). 이제 당신이하고있는 것과 같은 일을하고 싶을 때, 필요한 데이터는 이미 enum-just 집합에 있습니다. Post.PostStatus = Action (문자열에서 같은 enum 유형으로 Action을 변경한다고 가정 할 때) - DB 없음 필요한 히트.

우리는 또한 DB를 사용하지 않고 ID를 설정할 수 있도록 앱 시작시 DB에서 한 번 캐시하고 사전에 넣을 때 좀 더 동적 인 몇 가지 기능을 제공합니다. 수백만 가지 가치에 대해 이야기하지 않는 한 매우 효율적입니다.

+0

좋습니다.하지만 그것이 열거 형 일 필요는 없다고 가정 해 봅시다. 사용자가 다른 드롭 다운에서 선택한 것과 같은 이유가 무엇이든간에 이미 다른 관련 레코드의 ID를 가지고 있으며이를 설정하려고한다고 가정 해 보겠습니다. 예를 들어 게시물에는 작성자가 있고 저자 테이블이 있으며 작성자의 ID가 있으며이를 게시 레코드로 설정하려고합니다. 이것보다 더 좋은 방법이 있습니까? –

+0

그것이 내가 언급했던 두 번째 일이 어떻게 작동 하는지를 보여줍니다. "LoadWith"또는 관련 테이블 값을 지연로드하지 않는 한 하위 레코드의 ID 값을 설정하고 SubmitChanges를 설정하면됩니다. 관련된 객체를 심하게로드하면 ID를 설정할 수 없지만 그렇게하지 않으면 잘 동작합니다. – nitzmahone