2013-07-30 6 views
5

मेरे पास एक ऑटो-जेनरेट एंटिटी फ्रेमवर्क मॉडल है। यह डेटाबेस पहले दृष्टिकोण का उपयोग कर उत्पन्न किया गया था। mid_initial कॉलम में डेटाबेस परिभाषित बाधा है जो कॉलम को अधिकतम 3 वर्णों तक सीमित करती है।डाटाबेस पहला सत्यापन

//------------------------------------------------------------------------------ 
// <auto-generated> 
// This code was generated from a template. 
// 
// Manual changes to this file may cause unexpected behavior in your application. 
// Manual changes to this file will be overwritten if the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

namespace Agency.DataAccess.RegistrationModel 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Registrant 
    { 
     public Registrant() 
     { 
     } 

     public int id { get; set; } 
     public string fname { get; set; } 
     public string mid_initial { get; set; } 
     public string lname { get; set; } 
    } 
} 

जब मैं कोशिश करते हैं और एक mid_initial 3 से अधिक वर्ण, एक अमान्य स्थिति के साथ एक मॉडल बनाने, ModelState.IsValid सच लौटा रहा है। इस db.SaveChanges के कारण इसे तब कहा जाता है, जो DbEntityValidationException उठाता है।

[HttpPost] 
public ActionResult Create(Registrant registrant) 
{  
    try 
    { 
     if (ModelState.IsValid) 
     { 
      Debug.WriteLine("Entity was valid."); 
      db.Registrants.Add(registrant); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View("Create", registrant); 
    } 
    catch (DbEntityValidationException e) 
    { 
     foreach (var eve in e.EntityValidationErrors) 
     { 
      Debug.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", 
       eve.Entry.Entity.GetType().Name, eve.Entry.State); 
      foreach (var ve in eve.ValidationErrors) 
      { 
       Debug.WriteLine("- Property: \"{0}\", Error: \"{1}\"", 
        ve.PropertyName, ve.ErrorMessage); 
      } 
     } 
     return View(registrant); 
    } 
} 

क्यों ModelState.IsValid विधि सच लौट रहा है? ऐसा लगता है कि मेरा मॉडल अधिकतम लंबाई बाधा से अवगत नहीं है। मैं इसे कैसे अवगत करा सकता हूं?

उत्तर

4

ईएफ डीबी-पहले डेटाबेस से बाधाओं का अनुमान नहीं लगा सकता है।

उपयोग MaxLenght डेटा एनोटेशन विशेषता:

public partial class Registrant 
{ 
    public Registrant() 
    { 
    } 

    public int id { get; set; } 
    public string fname { get; set; } 
    [MaxLength(3, ErrorMessage = "")] 
    public string mid_initial { get; set; } 
    public string lname { get; set; } 
} 

नोट: इस वर्ग के एक ऑटो उत्पन्न वर्ग और हर बार जब आप को अद्यतन करने और अपने मॉडल (.EDMX फ़ाइल) को बचाने के है, इस कोड को ओवरराइट किया जाएगा और आप ' आपके गुण खो देंगे।

इससे बचने के लिए, आपको अपने वर्गों को अपने आंशिक कक्षाओं के समान नाम और समान नामस्थान के साथ कुछ आंशिक कक्षाओं के साथ विस्तारित करना चाहिए। यदि आपको उदाहरण दिखाने के लिए उदाहरण की आवश्यकता है, तो मुझे इसे उत्तर में रखने के लिए कहें।

+0

बंद करें ... लेकिन, जैसा कि मैं समझता हूं, यह काम नहीं करेगा। कंपाइलर कहेंगे: "त्रुटि 2 प्रकार 'रजिस्ट्रार' में पहले से ही 'mid_initial' की परिभाषा है ...) 'मेटाडेटा टाइप' विशेषता के साथ वर्ग 'रजिस्ट्रार' को चिह्नित करने और सत्यापन के लिए एक और कक्षा बनाने की आवश्यकता है। Http: // stackoverflow। com/प्रश्न/25722866/EF5-db-पहले उत्पन्न मॉडल और कस्टम मान्यता/25,741,213 # 25,741,213 –

3

एमवीसी ईएफ-अज्ञेयवादी है, और इस तरह अपने मॉडलस्टेट को पॉप्युलेट करने के लिए ईएफ सत्यापन का उपयोग करके मॉडल को मान्य करने का पूरी तरह से प्रयास नहीं करता है। MVC फिल्टर, DbContext.GetValidationErrors और ModelState का उपयोग कर उदाहरण के लिए,

  • उन्हें हुक अप अपने आप को:

    आप चार बुनियादी समाधान मैं अभी के बारे में सोच सकते हैं।

  • तृतीय-पक्ष कोड ढूंढें और उसका उपयोग करें जो पहले से ही करता है।
  • एमवीसी उपयोग कर सकते हैं कि सुविधाओं का उपयोग कर अलग से कोड मान्य करें, उदाहरण के लिए DataAnnotations का उपयोग कर। आप ईएफ टी 4 टेम्पलेट को संशोधित करके स्वचालित रूप से उत्पन्न करने का प्रयास कर सकते हैं। ध्यान दें कि यह अभी भी तकनीकी रूप से अनावश्यक है (कोड दो बार मान्य किया जाएगा, एक बार एमवीसी द्वारा, एक बार ईएफ द्वारा)।
  • एमवीसी के लिए एक पैच सबमिट करें ताकि यह स्पष्ट रूप से ईएफ का समर्थन कर सके (नरम निर्भरता के रूप में) और इसे सभी काम करें (दोनों परियोजनाएं खुले स्रोत हैं) - या मुझे कम करें क्योंकि उन्होंने पहले से ऐसा किया है और मैं कभी नहीं जानता था यह।
संबंधित मुद्दे