2012-11-19 2 views
0

데이터베이스에서 검색을 설정하려고합니다. EF (Entity Framework) 개체 emUser 및 일반 클래스 User이 emUser에서 상속되지만 추가 기능이 추가되었습니다.Entity Framework 개체에서 상속

public class User : emUser 
{ 
    #region Properties 
    public string Username 
    { 
     get { return Email; } 
    } 
    public string FullName 
    { 
     get { return FirstName + " " + LastName; } 
    } 
    #endregion 
} 

public partial class emUser : EntityObject 
{ 
    [code ...] 
} 

사용자가 emUser로부터 상속 받았지만 명시 적으로 변환 할 수 없습니다. 내가 사용하고 코드 :

List<User> returnUsers = new List<User>(); 
var users = 
    (from u in edm.UserSet.OfType<emUser>() 
    select u); 

    if (users != null) 
    { 
     foreach (emUser user in users) 
     { 
      User newUser = (User)user; 
      returnUsers.Add(newUser); 
     } 
    } 
return returnUsers; 

나는 User emUser에 대한 래퍼를 만들 수 있지만, 나는 그것을 내가 emUser을 변경할 때마다 변경해야합니다. 기술 서비스 계층과 도메인 계층에서 사용되는 클래스를 구별하기 위해 User을 사용하고 싶습니다.

{System.InvalidCastException: Unable to cast object of type 'Services.emUser' to type 'Users.User'. at Services.DatabaseController.GetUsers() in [file path]:line 412} 

가 왜 사용자에 emUser을 변환 할 수 없습니다 :

는이 같은 오류 메시지가? 그것에 대해 User을 모르기 때문에 EF 만 emUser 객체를 반환 할 수 있습니다와 emUserUser하지 않을 수 있습니다 : 여기

+0

'사용자'는 'emUser'이지만 '사용자'는 '사용자'가 아닙니다. 너는 그렇게 할 수 없다. – SLaks

+0

왜이 다운 캐스트가 효과가 있다고 기대합니까? EF는 오직'EMUser' 객체 만 반환 할 수 있습니다. 가치가있는 부분에 대해서는 모델 계층과 서비스 계층에 대한 병렬 데이터 구조를 갖는 것이 나쁜 생각이며 상속을 잘못 사용한다고 생각합니다. 서비스 레이어가 그 아래의 레이어와 통신하는 것은 나쁜 디자인이 아닙니다. 해당 레이어에 속하지 않는 모델 클래스를 사용하여 기능을 추가해야하는 경우 직각으로 수행하십시오. (모델 개체를 매개 변수로 사용하는 "일반"함수 나 서비스 계층에 정의 된 확장 메서드 사용) – millimoose

답변

0

귀하의 문제는 @millimoose 말한 것입니다.

  1. EntityObject에서 상속 후 User에서 emUser 상속을 가지고 User를 설정합니다

    당신은 여기에서 세 가지 솔루션을 가지고있다. 이것은 구현하는 데 큰 고통이 될 것이고 당신에게 유용한 이점을주지 않을 것입니다.

  2. 전달할 데이터 전송 객체를 만듭니다. 기본적으로 모든 속성을 emUser에서 User (일반적으로 User의 생성자를 통해)에 복사합니다. 이것은 당신에게 당신이 원하는 분리를 줄 것이지만, 고통이 될 것입니다.
  3. emUser의 새로운 partial 클래스에 추가 속성을 추가하십시오. 이것은 간단하고 간단하기 때문에 내가 권하고 싶은 것은 이것이다.

다음은 예입니다 :

// In a manually generated file in the same project 
public partial class emUser 
{ 
    #region Properties 
    public string Username 
    { 
     get { return Email; } 
    } 
    public string FullName 
    { 
     get { return FirstName + " " + LastName; } 
    } 
    #endregion 
} 

// In the automatically generated file 
public partial class emUser : EntityObject 
{ 
    [code ...] 
} 

사용법 : 당신이 변환 연산자를 추가하지 않는

emUser foo = GetUser(); 
Console.WriteLine("FirstName: " + emUser.FirstName); 
Console.WriteLine("FullName: " + emUser.FullName); 
+0

감사합니다! 이것은 매우 도움이되었습니다. 몇 가지 생각을 한 후에 동일한 해결책을 찾았습니다 (3 번).예를 들어 공용 인터페이스를 사용했다면 동일한 속성을 매핑하는 데 사용할 수 있었지만 부분 클래스를 사용하는 것이이 경우 최상의 솔루션입니다! – kumaheiyama

+0

@kumaheiyama - 물론입니다. 이것이 바로 거의 모든 자동 생성 코드 (EF, L2S 또는 심지어 winform)가 부분 클래스 - 쉬운 확장 성으로 생성 된 이유입니다. 도와 줘서 기뻐요! – Bobson

0

당신은 파생 클래스에 기본 클래스를 변환 할 수 없습니다.

public class User : emUser 
{ 
    #region Properties 
    public string Username 
    { 
     get { return Email; } 
    } 
    public string FullName 
    { 
     get { return FirstName + " " + LastName; } 
    } 
    #endregion 

    public static explicit operator User (emUser user) 
    { 
     User result = new User(); 
     // set properties 
     return result; 
    } 
} 
+0

고마워요 @ 모에! 이것도 유용한 해결책이었고, 아마도 미래에 그것을 사용할 것입니다. – kumaheiyama

관련 문제