इकाई फ्रेमवर्क कोड प्रथम दिनांक फ़ील्ड निर्माण


83

मैं अपना डेटाबेस टेबल बनाने के लिए Entity Framework Code First Method का उपयोग कर रहा हूं। निम्न कोड DATETIMEडेटाबेस में एक कॉलम बनाता है , लेकिन मैं एक DATEकॉलम बनाना चाहता हूं ।

[DataType(DataType.Date)]
[DisplayFormatAttribute(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public DateTime ReportDate { get; set; }

मैं DATEतालिका निर्माण के दौरान, प्रकार का एक स्तंभ कैसे बना सकता हूं ?

जवाबों:


22

डेविड रोथ के उत्तर का EF6 संस्करण इस प्रकार है:

public class DataTypePropertyAttributeConvention 
    : PrimitivePropertyAttributeConfigurationConvention<DataTypeAttribute>
{
    public override void Apply(ConventionPrimitivePropertyConfiguration configuration, 
        DataTypeAttribute attribute)
    {
        if (attribute.DataType == DataType.Date)
        {
            configuration.HasColumnType("Date");
        }
    }
}

इसे पहले की तरह पंजीकृत करें:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     base.OnModelCreating(modelBuilder);

     modelBuilder.Conventions.Add(new DataTypePropertyAttributeConvention());
}

यह टायलर डर्डन के दृष्टिकोण के समान परिणाम है, सिवाय इसके कि यह नौकरी के लिए ईएफ बेस क्लास का उपयोग कर रहा है।


165

(EntityFramework.dll में परिभाषित) ColumnAttributeसे उपयोग करने का प्रयास करें System.ComponentModel.DataAnnotations:

[Column(TypeName="Date")]
public DateTime ReportDate { get; set; }

1
आपको त्रुटि मिल सकती है Sequence contains no matching element, यदि आप एक DB की ओर इशारा कर रहे हैं जो तारीख का समर्थन नहीं करता है। SQL Server 2014 करता है।
जेस

8
using System.ComponentModel.DataAnnotations.Schema;
EF6 में

11

मैं निम्नलिखित का उपयोग करता हूं

    [DataType(DataType.Time)]
    public TimeSpan StartTime { get; set; }

    [DataType(DataType.Time)]
    public TimeSpan EndTime { get; set; }

    [DataType(DataType.Date)]
    [Column(TypeName = "Date")]
    public DateTime StartDate { get; set; }

    [DataType(DataType.Date)]
    [Column(TypeName = "Date")]
    public DateTime EndDate { get; set; }

एंटिटी फ्रेमवर्क 6 और SQL सर्वर एक्सप्रेस 2012 के साथ - 11.0.2100.60 (X64)। यह पूरी तरह से काम करता है और sql सर्वर में समय / दिनांक स्तंभ प्रकार उत्पन्न करता है


आपके समाधान ने काम किया। @YakoobHammouriकाम नहीं किया। मुझे दोनों एनोटेशन का उपयोग करना था [DataType(DataType.Date)]और [Column(TypeName = "Date")]जैसा कि आपने सुझाव दिया था। हालांकि इस समाधान बनाया तिथि प्रारूप की तरह yyyy-mm-ddके रूप में करने का विरोध कियाMM-dd-yyyy
nam

9

मुझे यह काम EF6 में अच्छी तरह से मिला।

मैंने अपने डेटा प्रकारों को निर्दिष्ट करने के लिए एक सम्मेलन बनाया। यह कन्वेंशन डेटाबेस निर्माण में डिफ़ॉल्ट डेटटाइम डेटा प्रकार को डेटाइम से डेटाटाइम 2 में बदलता है। यह तब किसी भी गुण के लिए एक अधिक विशिष्ट नियम लागू करता है जिसे मैंने DataType (DataType.Date) विशेषता के साथ सजाया है।

public class DateConvention : Convention
{
    public DateConvention()
    {
        this.Properties<DateTime>()
            .Configure(c => c.HasColumnType("datetime2").HasPrecision(3));

        this.Properties<DateTime>()
            .Where(x => x.GetCustomAttributes(false).OfType<DataTypeAttribute>()
            .Any(a => a.DataType == DataType.Date))
            .Configure(c => c.HasColumnType("date"));
    }
}

फिर अपने संदर्भ में तब सम्मेलन को पंजीकृत करें:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    modelBuilder.Conventions.Add(new DateConvention());
    // Additional configuration....
}

किसी भी तारीख गुणों की विशेषता जोड़ें जो आप केवल तारीख की इच्छा रखते हैं:

public class Participant : EntityBase
{
    public int ID { get; set; }

    [Required]
    [Display(Name = "Given Name")]
    public string GivenName { get; set; }

    [Required]
    [Display(Name = "Surname")]
    public string Surname { get; set; }

    [DataType(DataType.Date)]
    [Display(Name = "Date of Birth")]
    public DateTime DateOfBirth { get; set; }
}

1
वास्तव में महान समाधान! एक बात मैं जोड़ना चाहता हूं कि यह पूरी तरह से स्पष्ट है, कि इसका उपयोग करने के लिए आपको तिथि संपत्ति पर विशेषता जोड़ने की आवश्यकता है जैसे [डेटाटाइप (डेटाटाइप.डेट)] पब्लिक डेटटाइम इश्यूडेट {प्राप्त करें; सेट; }
स्टीफन लॉटियर

यदि आप चाहें तो केवल विशिष्ट DateTime गुणों के लिए इसका उपयोग करने में सक्षम होने के लिए @StephenLautier हाँ को अवश्य जोड़ें। मेरे द्वारा जोड़े गए कोड में, मैं दिखाता हूं कि आप अपने सभी DateTime प्रकारों के लिए एक सामान्य नियम भी लागू कर सकते हैं और फिर DataType (DataType.Date) सजावट वाले लोगों के लिए एक अधिक विशिष्ट नियम बना सकते हैं। आशा है कि यह किसी भी भ्रम को साफ करता है।
टायलर डरडेन

1
अच्छा समाधान, लेकिन ईएफ आपके लिए यह काम करने के लिए एक आधार वर्ग प्रदान करता है - विवरण के लिए मेरा समाधान देखें।
रिचर्ड

@ रिचर्ड ने मुझे आपके समाधान के लिए वोट दिया, क्योंकि आप सही हैं। कारण मैंने अपना समाधान बनाया था, क्योंकि EF डेटटाइम गुण SQL सर्वर में डेटाटाइम डेटा प्रकार का उपयोग करने के लिए था, न कि डेटटाइम 2 डेटा प्रकार जो .NET डेटाइम प्रॉपर्टी के साथ संगत है। शुक्र है कि ईएफ कोर ने इस मुद्दे को अब ठीक कर दिया है।
टायलर डर्डन

5

आप विशेषताओं के साथ अपनी कक्षाओं को सजाने के लिए नहीं पसंद करते हैं, तो आप में सेट कर सकते हैं DbContextकी OnModelCreatingइस तरह:

public class DatabaseContext: DbContext
{
    // DbSet's

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        // magic starts
        modelBuilder.Entity<YourEntity>()
                    .Property(e => e.ReportDate)
                    .HasColumnType("date");
        // magic ends

        // ... other bindings
    }
}

4

इसके साथ ही ColumnAttributeआप इसके लिए एक कस्टम विशेषता सम्मेलन भी बना सकते हैं DataTypeAttribute:

public class DataTypePropertyAttributeConvention : AttributeConfigurationConvention<PropertyInfo, PrimitivePropertyConfiguration, DataTypeAttribute>
{
    public override void Apply(PropertyInfo memberInfo, PrimitivePropertyConfiguration configuration, DataTypeAttribute attribute)
    {
        if (attribute.DataType == DataType.Date)
        {
            configuration.ColumnType = "Date";
        }
    }
}

बस अपने OnModelCreating विधि में सम्मेलन को पंजीकृत करें:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     base.OnModelCreating(modelBuilder);

     modelBuilder.Conventions.Add(new DataTypePropertyAttributeConvention());
}

इसे ईएफ में बनाया जाना चाहिए। साझा करने के लिए धन्यवाद!
तुगबरक

दुर्भाग्य से यह EF6 के रूप में पदावनत किया गया है और अब मान्य नहीं है।
टायलर डर्डन

1
EF6 ने ऐसा करने का एक नया तरीका प्रदान किया - विवरण के लिए मेरा समाधान देखें।
रिचर्ड

3

यह इस सवाल पर @LadislavMrnka द्वारा सबसे अधिक मतदान के जवाब के लिए सिर्फ एक वृद्धि है

यदि आपके पास बहुत सारे Dateकॉलम हैं, तो आप कस्टम विशेषता बना सकते हैं और फिर जब चाहें तब इसका उपयोग कर सकते हैं, इससे इकाई वर्गों में अधिक स्वच्छ कोड का उत्पादन होगा

public class DateColumnAttribute : ColumnAttribute
{
    public DateColumnAttribute()
    {
        TypeName = "date";
    }
}

प्रयोग

[DateColumn]
public DateTime DateProperty { get; set; }

-3

सबसे अच्छा तरीका यह का उपयोग कर

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

लेकिन आपको EntityFramework v 6.1.1 का उपयोग करना चाहिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.