나는 스티븐 클리어 리의 대답에 대해 자세히 설명하고 싶습니다. EF에서 비즈니스 규칙을 처리하기 위해 부분 클래스/메소드를 사용하는 것이 맞습니다. 그러나 그는 부분적인 수업/방법 내에서해야 할 일에 대해 자세하게 설명하지 않았습니다. 내 블로그에서 URL 단축 서비스를 만들어이를 예로 사용했습니다. 내 ShortURL
엔티티에는 두 개의 열/속성 만 있습니다. Url
및 ID
.
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\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)"))
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로 전파하는 방법에 대한 실제 예제. 개선이 필요하거나 놓친 것이 있으면 알려주세요.
또한 도메인 모델 인 엔티티 프레임 워크 클래스입니까? 또는 당신은 별도의 수업을 가지고 있습니까? – RPM1984
Entity 객체 또는 POCO를 사용하고 있습니까? –
@Ladislav : Visual Studio 2010에서'EF'를 사용합니다. – Xaqron