2015-11-03 5 views
8

कभी-कभी इकाई फ्रेमवर्क कोड का उपयोग करते समय, डिफ़ॉल्ट सम्मेलन आपके द्वारा इच्छित डेटाबेस प्रकार नहीं बनाते हैं। उदाहरण के लिए डिफ़ॉल्ट रूप से System.DateTime की एक संपत्ति DateTime प्रकार का डेटाबेस कॉलम बनाता है। यदि आप चाहते हैं कि datetime2 (DateTime प्रकार है जिसमें समय क्षेत्र और डेलाइट सेविंग टाइम के साथ कोई समस्या नहीं है) तो क्या करना है?इकाई फ्रेमवर्क कोड पहले: डेटटाइम 2 के लिए कौन सा डेटाटाइप विशेषता है?

DataTypeAtrribute का उपयोग कर डेटा एनोटेशन के साथ आवश्यक डेटाबेस प्रकार निर्दिष्ट करना संभव है। DataTypeAttribute के रचनाकारों में से एक पैरामीटर DataType Enumeration स्वीकार करता है। तो एक कुछ की तरह निर्दिष्ट कर सकते हैं:

[DataType(DataType.DateTime)] 
public DateTime DateOfBirth {get; set;} 

डेटा प्रकार गणना प्रकार प्रकार के एक बहुत कुछ शामिल है, लेकिन यह DateTime2 के लिए एक मूल्य याद आ रही है।

एक और दृष्टिकोण फ्लुएंट एपीआई का उपयोग करेगा। विधि DBContext.OnModelCreating में एक DateTime2 बनाएँ:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Student>().Property(p => p.BirthDate) 
     .HasColumnType("datetime2"); 
} 

DataTypeAttribute एक second constructor that accepts a string है। इस स्ट्रिंग को

डेटा फ़ील्ड से संबद्ध करने के लिए कस्टम फ़ील्ड टेम्पलेट का नाम परिभाषित किया गया है।

तो एक ग्रहण करेंगे कि निम्नलिखित एक datetime2 बनाने के लिए पर्याप्त होगा:

[DataType("datetime2")] 
public DateTime DateOfBirth {get; set;} 

ओह, यह काम नहीं करता। बनाए गए कॉलम में अभी भी DateTime प्रारूप है।

प्रश्न: डेटाटाइम 2 बनाने के लिए कन्स्ट्रक्टर में किस स्ट्रिंग का उपयोग करना है?

उत्तर

18

The DataType attribute is not used for column type mapping for Code First:

कॉलम एनोटेशन एक मैप की गई स्तंभ की विशेषताओं को निर्दिष्ट में एक अधिक निपुण है। आप एक नाम, डेटा प्रकार या यहां तक ​​कि ऑर्डर कर सकते हैं जिसमें तालिका में एक कॉलम दिखाई देता है। [...] DataType DataAnotation के साथ कॉलम के TypeName विशेषता को भ्रमित न करें। डेटाटाइप यूआई के लिए उपयोग की जाने वाली एक एनोटेशन है और इसे पहले कोड द्वारा अनदेखा किया जाता है।

तो:

[Column(TypeName="datetime2")] 
4

अभी भी कैसे संपत्तियों के लिए स्तंभ प्रकार को परिभाषित करने के लिए में रुचि रखने वालों के लिए। DbContext.OnModelCreating में आप परिभाषित कर सकते हैं कि किसी प्रकार के प्रत्येक मान में कुछ डेटाबेस प्रकार होना चाहिए।

यदि आप ऐसा करते हैं, तो आपको प्रत्येक दिनांक समय के लिए विशेषताओं और न ही धाराप्रवाह API लिखना होगा। यह सुसंगत होना आसान है और सभी डेटटाइम के समान कॉलम प्रकार होने दें। इसी तरह आप सभी दशमलव को एक ही परिशुद्धता दे सकते हैं, भले ही भविष्य में दशमलव जोड़े गए हों।

मान लीजिए कि आप यह परिभाषित करना चाहते हैं कि प्रत्येक System.DateTime में कॉलम प्रकार DateTime2 होना चाहिए; प्रत्येक System.Decimal में निर्दिष्ट परिशुद्धता वाला कॉलम प्रकार होना चाहिए।डीबीकॉन्टेक्स्ट में आप लिखेंगे:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // every property of type DateTime should have a column type of "datetime2": 
    modelBuilder.Property<DateTime>() 
     .Configure(property => property.HasColumnType("datetime2"); 
    // every property of type decimal should have a precision of 19 
    // and a scale of 8: 
    modelBuilder.Property<decimal>() 
     .Configure(property => property.HasPrecision(19, 8); 
} 
संबंधित मुद्दे