2011-02-10 3 views
2

주제에 심지어 많은 Q/A, 나는이 질문에 대한 명확한 답을 찾지 못했습니다.확장 엔티티 프레임 워크 클래스

은 단순히 기본 개체 값을 설정하기 전에 몇 가지 검증을 확인하려면 :

public Property 
{ 
    get { return base.Property; } 
    set 
    { 
     // Do some validations or other business logic 
     base.Property = value; 
    } 
} 

그것은 모든 속성은 엔티티 클래스에 이미있을 때 BLL에 처음부터 새 클래스를 만들 수 이해가되지 않습니다. 반면 엔티티 클래스는 비즈니스 로직 규칙으로 확장해야합니다.

DAL (엔터티)의 변경 사항이 인터페이스와 BLL 클래스에 모두 반영되므로 인터페이스를 사용하려면 추가 작업이 필요합니다.

엔티티 클래스를 상속하고 속성을 재정의하고 추가 속성과 메서드를 추가하는 것이 좋은 방법인지 잘 모르겠습니다.

나에게 도움이되는 샘플 의사 코드.

감사합니다.

+0

또한 도메인 모델 인 엔티티 프레임 워크 클래스입니까? 또는 당신은 별도의 수업을 가지고 있습니까? – RPM1984

+0

Entity 객체 또는 POCO를 사용하고 있습니까? –

+0

@Ladislav : Visual Studio 2010에서'EF'를 사용합니다. – Xaqron

답변

3

EF 디자이너가 생성 한 코드를 확인하십시오.

각 속성 Property 실제로 다음과 같이 구현됩니다

public global::System.String Property 
    { 
     get 
     { 
      return _Property; 
     } 
     set 
     { 
      OnPropertyChanging(value); 
      ReportPropertyChanging("Property"); 
      _Property = StructuralObject.SetValidValue(value, false); 
      ReportPropertyChanged("Property"); 
      OnPropertyChanged(); 
     } 
    } 
    private global::System.String _Property; 
    partial void OnPropertyChanging(global::System.String value); 
    partial void OnPropertyChanged(); 

부분 방법 On-Property-Changing는 단일 속성 검증 또는 비즈니스 로직을 할 수있는 곳입니다.

+0

@Stephen : BLL과 별도의 프로젝트가 필요합니다. EF보다 래퍼 같은 것. 제안 된 접근 방식에 대한 온라인 샘플이 있습니까? – Xaqron

+0

[부분 클래스 및 메서드에 대한 MSDN] (http://msdn.microsoft.com/en-us/library/wa80x488.aspx) 왜 당신의 BLL DLL이 EF를 포함하고있는 DLL과 분리되어 있어야하는지 잘 모르겠다. EF 수업은 * 당신의 BLL 이니까. –

+0

훌륭한 대답! +1, 이제 EF 엔티티에서 모델 유효성 검사를 수행 할 수 있습니다. 그러나, 부분적인 방법으로있을 때 어떻게 무효로 돌려 놓을까요? 부분 메서드는 void를 반환합니다. 값이 유효하지 않다고 결정할 때 속성이 변경되지 않도록하려면 어떻게해야합니까? – Chev

2

Xaqron, 난 당신이 이런 부분 클래스를 사용할 수 있습니다 PropertyListing라는 EF의 클래스가있는 경우는, 예를 들어, 부분 클래스를 사용하여 발견하는 가장 좋은 방법 :

Partial Public Class PropertyListing 
    Inherits EntityObject 

    'Do something here 

End Class 

이제 수를 수업을 원하는만큼 작은 부분으로 확장하거나 큰 호응을 얻지 마십시오. 이 예제는 VB에서 있지만 당신은 그것의 jist를 얻을

+0

그리고 무언가를 무효화해야한다면? – Xaqron

4

나는 스티븐 클리어 리의 대답에 대해 자세히 설명하고 싶습니다. EF에서 비즈니스 규칙을 처리하기 위해 부분 클래스/메소드를 사용하는 것이 맞습니다. 그러나 그는 부분적인 수업/방법 내에서해야 할 일에 대해 자세하게 설명하지 않았습니다. 내 블로그에서 URL 단축 서비스를 만들어이를 예로 사용했습니다. 내 ShortURL 엔티티에는 두 개의 열/속성 만 있습니다. UrlID.

EF를 통해 실제로 데이터베이스에 저장하기 전에 단축 된 URL이 유효한 URL인지 확인하고 싶습니다. 그래서 부분 클래스와 메소드를 이렇게 만들었습니다 :

public partial class ShortURL 
{ 
    partial void OnUrlChanging(string url) 
    { 
     if (!Regex.IsMatch(url, @"(^((http|ftp|https):\/\/|www\.)[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)")) 
      throw new Exception("Not a valid URL."); 
    } 
} 

이렇게하면 EF가 속성을 변경하지 못하게되어 NULL이됩니다. 하지만 그게 전부입니다. 그것은 나에게 오류 메시지를 표시하고 사용자에게 표시하는 쉬운 방법을 제공하지 못했습니다. (편집 :http://www.sellsbrothers.com/posts/Details/12700에 따르면 IDataErrorInfo는 ASP에서 제대로 표시하기위한 오류 메시지를 얻는 유일한 방법입니다. NET MVC) 그래서 나는 어딘가에 웹의 어둠 속에서 발견 한 또 다른 예제를 따라 갔고 나는 부분 클래스를 IDataErrorInfo으로부터 상속 받았다. 그런 다음 인터페이스를 구현하고 오류 메시지를 저장할 개인 사전 개체를 포함 시켰습니다.

public partial class ShortURL : IDataErrorInfo 
{ 
    private Dictionary<string, string> errors = new Dictionary<string, string>(); 

    partial void OnUrlChanging(string url) 
    { 
     if (!Regex.IsMatch(url, @"(^((http|ftp|https):\/\/|www\.)[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?)")) 
      errors.Add("Url", "Not a valid URL."); 
    } 

    public string Error 
    { 
     get { return string.Empty; } //I never use this so I just return empty. 
    } 

    public string this[string columnName] 
    { 
     get 
     { 
      if (errors.ContainsKey(columnName)) 
       return errors[columnName]; 
      return string.Empty; //Return empty if no error in dictionary. 
     } 
    } 
} 

이제는 오류 메시지를 저장하고 검색하고 표시하는 모든 기능을 수행했습니다. 이제 다시 (MVC에서) 내 컨트롤러에서 나는 나중에 가고있다 if (!ModelState.IsValid)

[HttpPost] 
    public ViewResult URLShortener(ShortURL shortURL) 
    { 
     if (!ModelState.IsValid) 
      return View(); 
     shortURL.Url = shortURL.Url.ToLower().StartsWith("www.") ? "http://" + shortURL.Url : shortURL.Url; 
     shortURLRepository.AddShortURL(shortURL); 
     object model = "http://www.u413.com/" + ShortCodes.LongToShortCode(shortURL.UrlID); 
     //Not related to this answer but I had to cast my string as a generic object because the View() method has a (string, string) constructor that does something totally different. My view actually uses string as the model. I know I know, I could have just used ViewBag. 
     return View("ShowUrl", model); 
    } 

을 할 수 있어요. EF의 부분 메소드를 확장하는 방법뿐만 아니라 검증을 UI로 전파하는 방법에 대한 실제 예제. 개선이 필요하거나 놓친 것이 있으면 알려주세요.

+0

사실, ASP.NET MVC는 EF가 아니라 [예외를 삼키고 있습니다.] (http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.modelstate.aspx)입니다. –

+0

오? 당신은 어디에서, 그리고 그것을 over-ridable 알고 있습니까? – Chev

+0

아, 내 답변을 뒷받침하는 기사를 찾았습니다. IDataErrorInfo는 asp.net MVC에서 사용자 정의 유효성 검사 오류 메시지를 표시 할 수있는 유일한 방법입니다. http://www.sellsbrothers.com/posts/Details/12700. 예외를 던지면 작동하지만 유효성 검사 도우미가 사용자에게 표시하는 메시지를 지정할 수 없습니다. 또한 IDataErrorInfo를 구현할 때 모델 유효성 검사시 해당 컬렉션을 검사 할 때 예외를 throw하지 않아도됩니다. 사전에 오류를 추가하기 만하면 모델을 무효화 할 수 있습니다. – Chev