2009-08-10 2 views
1

방금 ​​LINQ to SQL 클래스를 사용하기 시작했으며, 이것이 읽기 가능한 코드를 작성하는 데 어떻게 도움이되는지 정말 좋아합니다. 문서에서 , 전형적인 예는 그 지정 유효성 검사를 수행하는 상태, 당신은 너무 부분 클래스를 생성 ::LINQ to SQL 처음 실패한 필드에서 중지하지 않고 모든 필드의 유효성을 검사합니다.

partial class Customer 
{ 
    partial void OnCustomerIDChanging(string value) 
    { 
     if (value=="BADVALUE") throw new NotImplementedException("CustomerID Invalid"); 
    } 
} 

와 유사하게 다른 분야에 대한 ... 그리고 코드 숨김에서, 나는 이런 식으로 뭔가를 넣어 오류 메시지를 표시하고 실수를 바로 잡기 위해 동일한 페이지에 사용자를 유지하십시오.

public void CustomerListView_OnItemInserted(object sender, ListViewInsertedEventArgs e) 
{ 
    string errorString = ""; 
    if (e.Exception != null) 
    { 
     e.KeepInInsertMode = true; 
     errorString += e.Exception.Message; 
     e.ExceptionHandled = true; 
    } 
    else errorString += "Successfully inserted Customer Data" + "\n"; 
    errorMessage.Text = errorString; 
} 

그래, 간단하지만 처음 예외가 발생하자마자 나머지 필드의 유효성을 검사하지 않습니다 !! 사용자가 하나의 실수보다 모드를 만든 경우를 의미하며, she/he/it은 첫 번째 오류 만 통보됩니다. 모든 입력을 확인하고 각각의 오류를 표시하는 다른 방법이 있습니까? 제안 사항에 감사드립니다. 감사합니다.

답변

0

나는 그것을 알아 냈다. 처음에는 유효성 검사에 실패했을 때 예외를 throw하는 대신 정적 변수가있는 클래스에 오류 메시지를 저장합니다. 이 작업을 수행하기 위해, 나는 이런 식의 DataContext 클래스는 각 테이블에 해당하는 클래스의

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

/// <summary> 
/// Summary description for SalesClassesDataContext 
/// </summary> 
public partial class SalesClassesDataContext 
{ 
    public class ErrorBox 
    { 
     private static List<string> Messages = new List<string>(); 
     public void addMessage(string message) 
     { 
      Messages.Add(message); 
     } 
     public List<string> getMessages() 
     { 
      return Messages; 
     } 
    } 
} 

을 :: 확장, 난 단지 기능이 같은 새로 정의 된 클래스 ::

public partial class Customer : SalesClassesDataContext.ErrorBox 

을 상속 것 OnValidate 오류 수가 0이 아닌 경우를 대비하여 예외를 던질 것입니다. 따라서 입력 한 데이터를 잃어 버리지 않고 동일한 입력 페이지에 삽입하고 유지하려고하지 마십시오.

+1

슬라 보 (Slabo), 이것은 포럼 사이트가 아니므로 실제 답변이 아닌 한 자신의 질문에 대한 답변을 게시해서는 안됩니다. 추가 할 항목이 더 있으면 원래 질문을 편집하십시오. –

0

LINQ가 아님. 아마도 의 유효성을 전에 LINQ에 알려 주면됩니다.

예외가있는 자연스러운 동작입니다.

+0

제안 해 주셔서 감사합니다. ASP.NET의 유효성 검사 컨트롤을 사용하여 유효성 검사를 수행한다고 생각하십니까? 나는 이것을 좋아하지 않는다. asp.net 부분을 간단한 textboxes, listview 또는 gridview 컨트롤 등으로 제한하는 것을 선호한다. 하지만 예외를 던지는 대신 오류를 저장하기 위해 트리거 할 수도있다. – Slabo

1

Enterprise Library Validation Application Block (VAB)의 작업처럼 보입니다. VAB는 모든 오류를 반환하도록 설계되었습니다. 이 외에도 예외가 발생하지 않으므로 유형을 확인하도록 요청하면됩니다.

VAB를 사용하기로 결정한 경우 LINQ to SQL의 OnXXXChanging 및 OnValidate 메서드를 사용하는 것이 좋습니다. DataContext 클래스의 SubmitChange (ConflictMode) 메서드를 재정 의하여 VAB의 유효성 검사 API를 호출하는 것이 가장 좋습니다. 이렇게하면 엔터티를 깨끗하게 유지하는 비즈니스 엔터티에서 유효성 검사 논리를 유지할 수 있습니다. 다음 예에서

봐 :

public partial class NorthwindDataContext 
{ 
    public ValidationResult[] Validate() 
    { 
     return invalidResults = (
      from entity in this.GetChangedEntities() 
      let type = entity.GetType() 
      let validator = ValidationFactory.CreateValidator(type) 
      let results = validator.Validate(entity) 
      where !results.IsValid 
      from result in results 
      select result).ToArray();    
    } 

    public override void SubmitChanges(ConflictMode failureMode) 
    { 
     ValidationResult[] this.Validate(); 

     if (invalidResults.Length > 0) 
     { 
      // You should define this exception type 
      throw new ValidationException(invalidResults); 
     } 

     base.SubmitChanges(failureMode); 
    } 

    private IEnumerable<object> GetChangedEntities() 
    { 
     ChangeSet changes = this.GetChangeSet(); 

     return changes.Inserts.Concat(changes.Updates); 
    } 
} 

[Serializable] 
public class ValidationException : Exception 
{ 
    public ValidationException(IEnumerable<ValidationResult> results) 
     : base("There are validation errors.") 
    { 
     this.Results = new ReadOnlyCollection<ValidationResult>(
      results.ToArray()); 
    } 

    public ReadOnlyCollection<ValidationResult> Results 
    { 
     get; private set; 
    } 
} 

모든 오류의 컬렉션을 반환합니다 유효성 검사() 메서드를 호출 아니라 유효성이(), 단순히 (SubmitChanges를 호출 할 것 호출하는 것보다) 때를 ' 계속 할 준비가되었습니다. SubmitChanges()는 오류를 검사하고 엔티티 중 하나가 유효하지 않은 경우 예외를 throw합니다.오류의 목록이 ValidationException로 전송되기 때문에, 다음과 같이, 호출 스택까지 높은 오류를 반복하고 사용자에게 제공 할 수 있습니다 :

try 
{ 
    db.SubmitChanges(); 
} 
catch (ValidationException vex) 
{ 
    ShowErrors(vex.ValidationErrors); 
} 

private static void ShowErrors(IEnumerable<ValidationResult> errors) 
{ 
    foreach(var error in errors) 
    { 
     Console.WriteLine("{0}: {1}", error.Key, error.message); 
    } 
} 

이 방법을 사용하면 당신이 있는지 확인하여 엔티티는 데이터베이스에 저장하기 전에 항상 유효성이 검사됩니다.

Here은 VAB를 LINQ와 SQL에 통합하는 방법을 설명하는 좋은 기사입니다. LAB에서 SQL로 VAB를 사용하려면 확실히 읽어야합니다.