2011-02-27 13 views
11

मान्य नहीं है मेरे पास एक साधारण परीक्षण परिदृश्य में एक ऑब्जेक्ट है जो ईएफ कोड का उपयोग करता है और IValidalidableObject लागू करता है। कुछ बहुत ही सरल तर्क है जो एक सत्यापन त्रुटि जोड़ता है और इसे वापस देता है। वस्तु पर अन्य सत्यापन भी हैं।ईएफ कोड पहले: IValidalidable ऑब्जेक्ट

हालांकि, ऑब्जेक्ट को सहेजते समय - विशेषता आधारित सत्यापन कार्य करते समय - IValidalidableObject इंटरफ़ेस कभी भी आग लगती नहीं है। डीबगर इसमें कदम नहीं उठाता है और त्रुटि कभी भी SaveChanges() या GetValidationErrors() को कॉल करने के साथ दिखाई नहीं देती है।

public class Customer : IValidatableObject { 
[Key] 
public int Id { get; set; } 

[StringLength(50)] 
[DisplayName("First Name")] 

public string FirstName { get; set; } 

[Required] 
[DisplayName("Last Name")] 
[StringLength(50)] 
public string LastName { get; set; } 

[Required] 
[StringLength(100)] 
public string Company { get; set; } 

[StringLength(200)] 
public string Email { get; set; } 

[DisplayName("Credit Limit")] 
public decimal CreditLimit { get; set; } 

[DisplayName("Entered On")] 
public DateTime? Entered { get; set; } 


public virtual ICollection<Address> Addresses { get; set; } 


public Customer() 
{ 
    Entered = DateTime.Now; 
    CreditLimit = 1000.00M; 

    Addresses = new List<Address>(); 
} 

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
{ 
    var results = new List<ValidationResult>(); 

    // add an error ALWAYS for testing - it doesn't show up 
    // and the debugger never hits this code 
    results.Add(new ValidationResult("Validate Added message",new [] { "Company" })); 

    return results; 
} 

जब मैं अब एक ग्राहक जोड़ सकते हैं और सत्यापन त्रुटियों के लिए जाँच करने के लिए प्रयास करें:

public void AddNewCustomer() 
{ 
    Customer customer = new Customer(); 

    context.Customers.Add(customer); 

    customer.LastName = "Strahl"; 
    customer.FirstName = "Rick"; 
    customer.Entered = DateTime.Now; 
    //customer.Company = "West Wind"; // missing causes val error 

    var errorEntries = context.GetValidationErrors(); 
} 

मैं IValidatableObject जो हमेशा विफल से कंपनी के लिए एक प्रमाणीकरण त्रुटि है, लेकिन कुछ भी नहीं मिलता है।

कोई विचार क्यों?

उत्तर

11

Jeff Handley's Blog Post on Validation Objects and Properties with Validator से उद्धरण:

जब एक वस्तु को मान्य, निम्नलिखित प्रक्रिया Validator.ValidateObject में लागू किया जाता है:

  1. मान्य प्रॉपर्टी-स्तरीय गुण
  2. किसी भी प्रमाणकों हैं अमान्य, विफलता (0)
  3. पर लौटने के सत्यापन को निरस्त करना
  4. मान्य वस्तु स्तर के जिम्मेदार बताते हैं
  5. किसी भी प्रमाणकों अमान्य हैं, मान्यता विफलता (ओं)
  6. तो डेस्कटॉप ढांचे पर लौटने गर्भपात और वस्तु को लागू करता है IValidatableObject, तो इसकी मान्य विधि कॉल और किसी भी विफलता (ओं)

यह बताता है कि आप क्या करने की कोशिश कर रहे हैं क्या बाहर के बॉक्स काम नहीं करेगा क्योंकि मान्यता चरण 2 # पर रद्द कर देगा लौट आते हैं।

+0

यूप यह है। यदि कोई अन्य सत्यापन त्रुटियां नहीं हैं तो IValidalidableObject कोड आग लगती है। यद्यपि इस व्यवहार के बारे में खुश नहीं है - यह उपयोगकर्ताओं को दिखाने वाली सभी त्रुटियों को दिखाने के लिए चूसने वाला नहीं है। –

+2

@ रिक - मैं सहमत हूं। यह शायद समयपूर्व अनुकूलन का मामला है ... –

संबंधित मुद्दे