การตั้งค่าเริ่มต้นของคุณสมบัติ DateTime เป็น DateTime ตอนนี้อยู่ใน System.ComponentModel ค่าเริ่มต้น Attrbute


97

มีใครทราบบ้างว่าฉันสามารถระบุค่าดีฟอลต์สำหรับคุณสมบัติ DateTime โดยใช้ System.ComponentModel DefaultValue Attribute ได้อย่างไร

ตัวอย่างเช่นฉันลองสิ่งนี้:

[DefaultValue(typeof(DateTime),DateTime.Now.ToString("yyyy-MM-dd"))]
public DateTime DateCreated { get; set; }

และคาดว่าค่าจะเป็นนิพจน์คงที่

นี่คือในบริบทของการใช้กับ ASP.NET Dynamic Data ฉันไม่ต้องการนั่งร้านคอลัมน์ DateCreated แต่เพียงแค่จัดหา DateTime ตอนนี้ถ้าไม่มี ฉันใช้ Entity Framework เป็นชั้นข้อมูลของฉัน

ไชโย

แอนดรู

คำตอบ:


95

คุณไม่สามารถดำเนินการกับแอตทริบิวต์ได้เนื่องจากเป็นเพียงข้อมูลเมตาที่สร้างขึ้นในเวลาคอมไพล์ เพียงเพิ่มโค้ดให้กับตัวสร้างเพื่อเริ่มต้นวันที่หากต้องการสร้างทริกเกอร์และจัดการกับค่าที่ขาดหายไปในฐานข้อมูลหรือใช้ getter ในลักษณะที่ส่งคืน DateTime ตอนนี้ถ้าฟิลด์สำรองไม่ได้ถูกเตรียมใช้งาน

public DateTime DateCreated
{
   get
   {
      return this.dateCreated.HasValue
         ? this.dateCreated.Value
         : DateTime.Now;
   }

   set { this.dateCreated = value; }
}

private DateTime? dateCreated = null;

2
ขอบคุณก่อนที่คุณจะแก้ไขฉันไปทางอื่นและสกัดกั้นผู้ตั้งค่า ไชโยสำหรับความช่วยเหลือ :-)
REA_ANDREW

10
getส่วนหนึ่งได้ง่ายไปที่:return dateCreated ?? DateTime.Now;
อด Krasnov

วิธีแก้ปัญหานี้อาจมีปัญหาในกรณีที่คุณต้องการให้ชั้นเรียนเป็น POCO ในกรณีของฉันคลาสของฉันควรมีความชัดเจนเท่ากับคลาส POCO ที่จะโอนผ่าน WCF
เจ

1
@zHs สิ่งนี้ใช้ได้ดีสำหรับฉันโดยใช้ Database First กับ Entity Framework
Joshua K

1
โปรดดูคำตอบนี้หากคุณมาที่นี่เพื่อรับแอตทริบิวต์
Storm Muller

60

เพิ่มด้านล่างไปยังคุณสมบัติ DateTime

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]

3
นี่คือสิ่งที่ฉันกำลังมองหาและมันควรจะสูงขึ้น คำตอบอื่น ๆ จำนวนมากจะเพิ่มวันที่ปัจจุบันเมื่อแทรกเอนทิตีอย่างไรก็ตามจะไม่ส่งผลกระทบต่อสคีมา (เช่นทำให้ getdate () เป็นค่าเริ่มต้น) ปัญหาสำหรับฉันคือเมื่อฉันต้องการเพิ่มระเบียนลงในตารางโดยตรง (โดยใช้ SQL) ฉันต้องระบุวันที่ (หรือปล่อยให้เป็น NULL) นี่เป็นทางออกที่ดีกว่ามาก ขอบคุณ.
Storm Muller

8
.Computed ใช้สำหรับการดำเนินการเพิ่มและอัปเดต ใช้. รหัสเฉพาะสำหรับเพิ่มเท่านั้น
Renan Coelho

1
คำตอบที่ดีที่สุด: ควรเพิ่มการอ้างอิงถึง System.ComponentModel.DataAnnotations.Schema สำหรับคำอธิบายประกอบ DatabaseGenerated
Yazan Khalaileh

จะใช้ไทม์โซนอะไร จะเป็น UTC หรือไม่?
Almis

25

ไม่มีเหตุผลใดที่ฉันสามารถคิดได้ว่าไม่ควรทำผ่านแอตทริบิวต์ อาจอยู่ในค้างของ Microsoft ใครจะรู้.

ทางออกที่ดีที่สุดที่ฉันพบคือใช้พารามิเตอร์ defaultValueSql ในการย้ายรหัสครั้งแรก

CreateTable(
    "dbo.SomeTable",
    c => new
        {
            TheDateField = c.DateTime(defaultValueSql: "GETDATE()")
        });

ฉันไม่ชอบโซลูชันอ้างอิงที่มักจะตั้งค่าในตัวสร้างคลาสเอนทิตีเพราะถ้าสิ่งอื่นที่ไม่ใช่ Entity Framework เกาะบันทึกในตารางนั้นฟิลด์วันที่จะไม่ได้รับค่าเริ่มต้น และความคิดในการใช้ทริกเกอร์เพื่อจัดการคดีนั้นดูเหมือนจะผิดสำหรับฉัน


1
ในกรณีที่แก้ไขและเพิ่ม nullable ให้ใช้ AddColumn ("dbo.table", "Created", c => c.DateTime (nullable: true, defaultValueSql: "getdate ()"));
Iman

ไม่ใช่ความคิดที่ดีถ้าคุณจะเลือกฐานข้อมูลของคุณคุณต้อง refactor รหัสนี้
ส่ง

24

ฉันได้ทดสอบสิ่งนี้กับEF core 2.1

คุณไม่สามารถใช้ข้อตกลงหรือคำอธิบายประกอบข้อมูลได้ที่นี่ คุณต้องใช้API คล่องแคล่ว

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property(b => b.Created)
            .HasDefaultValueSql("getdate()");
    }
}

เอกสารอย่างเป็นทางการ


นี่คือสิ่งที่ฉันต้องการ แต่เนื่องจากคุณสมบัติของฉันอยู่บน BaseClass ฉันจึงทำไม่ได้ (มันสร้างตารางใหม่สำหรับ BaseClass) อย่างไรก็ตามการตรวจสอบ ChangeTracker โดยใช้ลิงก์นี้สามารถแก้ไขได้ (การตั้งค่าการประทับเวลาที่สร้างและอัปเดต)
Jeppe

12

เป็นไปได้และค่อนข้างง่าย:

สำหรับ DateTime.MinValue

[System.ComponentModel.DefaultValue(typeof(DateTime), "")]

สำหรับค่าอื่น ๆ เป็นอาร์กิวเมนต์สุดท้ายของDefaultValueAttributeสตริงระบุที่แทนค่า DateTime ที่ต้องการ

ค่านี้จะต้องมีการแสดงออกอย่างต่อเนื่องและเป็นสิ่งจำเป็นในการสร้างวัตถุ ( DateTime) TypeConverterโดยใช้


1
ฉันอยากจะเชื่อว่าการใช้งานได้ผลสำหรับฉัน แต่น่าเสียดายที่มันไม่เป็นเช่นนั้น ผลการย้าย; defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)
Abdurrahman I.

เพิ่งพยายามใส่วันที่สตริง ("1/1/20") แทนสตริงว่างและมันก็แปลงสำเร็จ
user890332

5

วิธีแก้ปัญหาง่ายๆหากคุณใช้ Entity Framework คือการเพิ่มคลาสพาร์ทิคัลและกำหนดคอนสตรัคเตอร์สำหรับเอนทิตีเนื่องจากเฟรมเวิร์กไม่ได้กำหนดอย่างใดอย่างหนึ่ง ตัวอย่างเช่นหากคุณมีเอนทิตีชื่อตัวอย่างคุณจะใส่รหัสต่อไปนี้ในไฟล์แยกต่างหาก

namespace EntityExample
{
    public partial class Example : EntityObject
    {
        public Example()
        {
            // Initialize certain default values here.
            this._DateCreated = DateTime.Now;
        }
    }
}

นี่เป็นวิธีแก้ปัญหาที่สง่างามที่สุด (และอาจเป็นวิธีแก้ปัญหาด้วย) แต่นี่เป็นการสมมติว่าผู้คนใช้ EF Code First

1
นี่คือวิธีที่ฉันทำจนกระทั่งฉันตระหนักว่าการเพิ่มคุณสมบัติที่ซับซ้อนให้กับเอนทิตีของฉันทำให้ EF สร้างตัวสร้างเริ่มต้นทำให้ฉันไม่มีทางเขียนของตัวเองได้ ...
Dave Cousineau

5

ฉันคิดว่าวิธีแก้ปัญหาที่ง่ายที่สุดคือการตั้งค่า

Created DATETIME2 NOT NULL DEFAULT GETDATE()

ในการประกาศคอลัมน์และใน VS2010 EntityModel ชุดออกแบบที่สอดคล้องคุณสมบัติคอลัมน์StoreGeneratedPattern = Computed


ถ้าฉันทำเช่นนี้และทำให้คุณสมบัติเป็นโมฆะฉันได้รับข้อผิดพลาดในการตรวจสอบความถูกต้อง EDMX เนื่องจากคอลัมน์ที่ไม่เป็นค่าว่างถูกจับคู่กับคุณสมบัติที่เป็นโมฆะ
Niklas Peter

4

การสร้างคลาสแอตทริบิวต์ใหม่เป็นข้อเสนอแนะที่ดี ในกรณีของฉันฉันต้องการระบุ 'ค่าเริ่มต้น (DateTime)' หรือ 'DateTime.MinValue' เพื่อให้เครื่องอนุกรม Newtonsoft.Json ละเว้นสมาชิก DateTime ที่ไม่มีค่าจริง

[JsonProperty( DefaultValueHandling = DefaultValueHandling.Ignore )]
[DefaultDateTime]
public DateTime EndTime;

public class DefaultDateTimeAttribute : DefaultValueAttribute
{
    public DefaultDateTimeAttribute()
        : base( default( DateTime ) ) { }

    public DefaultDateTimeAttribute( string dateTime )
        : base( DateTime.Parse( dateTime ) ) { }
}

หากไม่มีแอตทริบิวต์ DefaultValue ตัวอนุกรม JSON จะแสดงเอาต์พุต "1/1/0001 00:00:00" แม้ว่าจะตั้งค่าตัวเลือก DefaultValueHandling.Ignore


4

เพียงแค่พิจารณากำหนดค่าในตัวสร้างของคลาสเอนทิตีของคุณ

public class Foo
{
       public DateTime DateCreated { get; set; }
       public Foo()
       {
           DateCreated = DateTime.Now;
       }

}

สิ่งนี้ได้ผลสำหรับฉัน แม้ว่าฉันจะต้องตั้งค่าDatetimeคุณสมบัติเป็นโมฆะก่อนที่จะทำสิ่งนี้
Ahashan Alam Sojib

3

ฉันต้องการเวลา UTC Timestamp เป็นค่าเริ่มต้นและแก้ไขโซลูชันของ Daniel เช่นนี้:

    [Column(TypeName = "datetime2")]
    [XmlAttribute]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
    [Display(Name = "Date Modified")]
    [DateRange(Min = "1900-01-01", Max = "2999-12-31")]
    public DateTime DateModified {
        get { return dateModified; }
        set { dateModified = value; } 
    }
    private DateTime dateModified = DateTime.Now.ToUniversalTime();

สำหรับบทช่วยสอน DateRangeAttribute โปรดดูโพสต์บล็อกที่ยอดเยี่ยมนี้



2

มีวิธี. เพิ่มชั้นเรียนเหล่านี้:

DefaultDateTimeValueAttribute.cs

using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using Custom.Extensions;

namespace Custom.DefaultValueAttributes
{
    /// <summary>
    /// This class's DefaultValue attribute allows the programmer to use DateTime.Now as a default value for a property.
    /// Inspired from https://code.msdn.microsoft.com/A-flexible-Default-Value-11c2db19. 
    /// </summary>
    [AttributeUsage(AttributeTargets.Property)]
    public sealed class DefaultDateTimeValueAttribute : DefaultValueAttribute
    {
        public string DefaultValue { get; set; }
        private object _value;

        public override object Value
        {
            get
            {
                if (_value == null)
                    return _value = GetDefaultValue();

                return _value;
            }
        }

        /// <summary>
        /// Initialized a new instance of this class using the desired DateTime value. A string is expected, because the value must be generated at runtime.
        /// Example of value to pass: Now. This will return the current date and time as a default value. 
        /// Programmer tip: Even if the parameter is passed to the base class, it is not used at all. The property Value is overridden.
        /// </summary>
        /// <param name="defaultValue">Default value to render from an instance of <see cref="DateTime"/></param>
        public DefaultDateTimeValueAttribute(string defaultValue) : base(defaultValue)
        {
            DefaultValue = defaultValue;
        }

        public static DateTime GetDefaultValue(Type objectType, string propertyName)
        {
            var property = objectType.GetProperty(propertyName);
            var attribute = property.GetCustomAttributes(typeof(DefaultDateTimeValueAttribute), false)
                ?.Cast<DefaultDateTimeValueAttribute>()
                ?.FirstOrDefault();

            return attribute.GetDefaultValue();
        }

        private DateTime GetDefaultValue()
        {
            // Resolve a named property of DateTime, like "Now"
            if (this.IsProperty)
            {
                return GetPropertyValue();
            }

            // Resolve a named extension method of DateTime, like "LastOfMonth"
            if (this.IsExtensionMethod)
            {
                return GetExtensionMethodValue();
            }

            // Parse a relative date
            if (this.IsRelativeValue)
            {
                return GetRelativeValue();
            }

            // Parse an absolute date
            return GetAbsoluteValue();
        }

        private bool IsProperty
            => typeof(DateTime).GetProperties()
                .Select(p => p.Name).Contains(this.DefaultValue);

        private bool IsExtensionMethod
            => typeof(DefaultDateTimeValueAttribute).Assembly
                .GetType(typeof(DefaultDateTimeExtensions).FullName)
                .GetMethods()
                .Where(m => m.IsDefined(typeof(ExtensionAttribute), false))
                .Select(p => p.Name).Contains(this.DefaultValue);

        private bool IsRelativeValue
            => this.DefaultValue.Contains(":");

        private DateTime GetPropertyValue()
        {
            var instance = Activator.CreateInstance<DateTime>();
            var value = (DateTime)instance.GetType()
                .GetProperty(this.DefaultValue)
                .GetValue(instance);

            return value;
        }

        private DateTime GetExtensionMethodValue()
        {
            var instance = Activator.CreateInstance<DateTime>();
            var value = (DateTime)typeof(DefaultDateTimeValueAttribute).Assembly
                .GetType(typeof(DefaultDateTimeExtensions).FullName)
                .GetMethod(this.DefaultValue)
                .Invoke(instance, new object[] { DateTime.Now });

            return value;
        }

        private DateTime GetRelativeValue()
        {
            TimeSpan timeSpan;
            if (!TimeSpan.TryParse(this.DefaultValue, out timeSpan))
            {
                return default(DateTime);
            }

            return DateTime.Now.Add(timeSpan);
        }

        private DateTime GetAbsoluteValue()
        {
            DateTime value;
            if (!DateTime.TryParse(this.DefaultValue, out value))
            {
                return default(DateTime);
            }

            return value;
        }
    }
}

DefaultDateTimeExtensions.cs

using System;

namespace Custom.Extensions
{
    /// <summary>
    /// Inspired from https://code.msdn.microsoft.com/A-flexible-Default-Value-11c2db19. See usage for more information.
    /// </summary>
    public static class DefaultDateTimeExtensions
    {
        public static DateTime FirstOfYear(this DateTime dateTime)
            => new DateTime(dateTime.Year, 1, 1, dateTime.Hour, dateTime.Minute, dateTime.Second, dateTime.Millisecond);

        public static DateTime LastOfYear(this DateTime dateTime)
            => new DateTime(dateTime.Year, 12, 31, dateTime.Hour, dateTime.Minute, dateTime.Second, dateTime.Millisecond);

        public static DateTime FirstOfMonth(this DateTime dateTime)
            => new DateTime(dateTime.Year, dateTime.Month, 1, dateTime.Hour, dateTime.Minute, dateTime.Second, dateTime.Millisecond);

        public static DateTime LastOfMonth(this DateTime dateTime)
            => new DateTime(dateTime.Year, dateTime.Month, DateTime.DaysInMonth(dateTime.Year, dateTime.Month), dateTime.Hour, dateTime.Minute, dateTime.Second, dateTime.Millisecond);
    }
}

และใช้ DefaultDateTimeValue เป็นแอตทริบิวต์สำหรับคุณสมบัติของคุณ ค่าที่จะป้อนให้กับแอตทริบิวต์การตรวจสอบความถูกต้องของคุณคือ "Now" ซึ่งจะแสดงผลในขณะทำงานจากอินสแตนซ์ DateTime ที่สร้างด้วย Activator รหัสที่มาเป็นแรงบันดาลใจจากกระทู้นี้: https://code.msdn.microsoft.com/A-flexible-Default-Value-11c2db19 ฉันเปลี่ยนเพื่อให้คลาสของฉันสืบทอดด้วย DefaultValueAttribute แทน ValidationAttribute


2

พบว่าสิ่งนี้กำลังมองหาสิ่งที่แตกต่างออกไป แต่ในเวอร์ชัน C # ใหม่คุณสามารถใช้เวอร์ชันที่สั้นกว่านี้ได้:

public DateTime DateCreated { get; set; } = DateTime.Now;

คำตอบที่ยอดเยี่ยมสิ่งที่ฉันต้องการ
Gjaa

สิ่งนี้ปลอดภัยที่จะใช้เสมอหรือไม่?
Jeppe

ไม่สามารถคิดถึงข้อเสียใด ๆ ได้เอกสารอย่างเป็นทางการบอกเพียงเล็กน้อยเกี่ยวกับการเริ่มต้นอัตโนมัติdocs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
Brandtware

2

ฉันประสบปัญหาเดียวกัน แต่สิ่งที่เหมาะกับฉันที่สุดคือด้านล่าง:

public DateTime CreatedOn { get; set; } = DateTime.Now;

0
public DateTime DateCreated
{
   get
   {
      return (this.dateCreated == default(DateTime))
         ? this.dateCreated = DateTime.Now
         : this.dateCreated;
   }

   set { this.dateCreated = value; }
}
private DateTime dateCreated = default(DateTime);

0

คุณจัดการกับสิ่งนี้อย่างไรในขณะนี้ขึ้นอยู่กับว่าคุณใช้ Linq กับ SQL หรือ EntityFramework รุ่นใด

ใน L2S คุณสามารถเพิ่ม

public partial class NWDataContext
{
    partial void InsertCategory(Category instance)
    {
        if(Instance.Date == null)
            Instance.Data = DateTime.Now;

        ExecuteDynamicInsert(instance);
    }
}

EF ซับซ้อนกว่าเล็กน้อยโปรดดูhttp://msdn.microsoft.com/en-us/library/cc716714.aspxสำหรับข้อมูลเพิ่มเติมเกี่ยวกับตรรกะธุรกิจของ EF


0

ฉันรู้ว่าโพสต์นี้เก่าไปหน่อย แต่มีข้อเสนอแนะที่อาจช่วยได้บ้าง

ฉันใช้ Enum เพื่อกำหนดว่าจะตั้งค่าอะไรในตัวสร้างแอตทริบิวต์

ประกาศทรัพย์สิน:

[DbProperty(initialValue: EInitialValue.DateTime_Now)]
public DateTime CreationDate { get; set; }

ตัวสร้างคุณสมบัติ:

Public Class DbProperty Inherits System.Attribute

    Public Property InitialValue As Object

    Public Sub New(ByVal initialValue As EInitialValue)
       Select Case initialValue
          Case EInitialValue.DateTime_Now
             Me.InitialValue = System.DateTime.Now

          Case EInitialValue.DateTime_Min
             Me.InitialValue = System.DateTime.MinValue

          Case EInitialValue.DateTime_Max
             Me.InitialValue = System.DateTime.MaxValue

       End Select

    End Sub
End Class

Enum:

Public Enum EInitialValue
   DateTime_Now
   DateTime_Min
   DateTime_Max
End Enum

0

ฉันคิดว่าคุณสามารถทำได้โดยใช้StoreGeneratedPattern = Identity(ตั้งค่าในหน้าต่างคุณสมบัติผู้ออกแบบโมเดล)

ฉันเดาไม่ออกว่าจะต้องทำอย่างไร แต่ในขณะที่พยายามคิดออกฉันสังเกตเห็นว่าคอลัมน์วันที่ของฉันบางคอลัมน์ผิดนัดไปแล้วCURRENT_TIMESTAMP()และบางคอลัมน์ก็ไม่ได้ผิดนัด การตรวจสอบรูปแบบที่ผมเห็นว่าแตกต่างระหว่างสองคอลัมน์นอกเหนือจากชื่อเป็นที่หนึ่งได้รับค่าเริ่มต้นที่มีการตั้งค่าให้StoreGeneratedPatternIdentity

ฉันไม่คาดคิดว่าจะเป็นอย่างนั้น แต่การอ่านคำอธิบายมันสมเหตุสมผล:

กำหนดว่าคอลัมน์ที่เกี่ยวข้องในฐานข้อมูลจะถูกสร้างขึ้นโดยอัตโนมัติหรือไม่ระหว่างการดำเนินการแทรกและอัพเดต

นอกจากนี้แม้ว่าสิ่งนี้จะทำให้คอลัมน์ฐานข้อมูลมีค่าเริ่มต้นเป็น "now" แต่ฉันเดาว่ามันไม่ได้ตั้งค่าคุณสมบัติให้อยู่DateTime.Nowใน POCO นี่ไม่ใช่ปัญหาสำหรับฉันเนื่องจากฉันมีไฟล์. tt ที่กำหนดเองซึ่งตั้งค่าคอลัมน์วันที่ทั้งหมดของฉันเป็นDateTime.Nowอัตโนมัติแล้ว (จริง ๆ แล้วการแก้ไขไฟล์. tt ด้วยตัวเองนั้นไม่ยากโดยเฉพาะอย่างยิ่งถ้าคุณมี ReSharper และได้รับการเน้นไวยากรณ์ ปลั๊กอิน (VS เวอร์ชันใหม่กว่าอาจเน้นไฟล์. tt อยู่แล้วไม่แน่ใจ))

ปัญหาสำหรับฉันคือ: ฉันจะทำให้คอลัมน์ฐานข้อมูลมีค่าเริ่มต้นได้อย่างไรเพื่อให้การสืบค้นที่มีอยู่ซึ่งละคอลัมน์นั้นยังคงใช้งานได้ และการตั้งค่าข้างต้นก็ใช้ได้ผล

ฉันยังไม่ได้ทดสอบ แต่อาจเป็นไปได้ว่าการตั้งค่านี้จะรบกวนการตั้งค่าที่ชัดเจนของคุณเอง (ฉันเพิ่งสะดุดกับสิ่งนี้ในตอนแรกเพราะ EF6 Database First เขียนโมเดลให้ฉันด้วยวิธีนี้)


0

ใน C # เวอร์ชัน 6 เป็นไปได้ที่จะระบุค่าเริ่มต้น

public DateTime fieldname { get; set; } = DateTime.Now;

1
ยินดีต้อนรับสู่ StackOverflow: หากคุณโพสต์โค้ด XML หรือตัวอย่างข้อมูลโปรดเน้นบรรทัดเหล่านั้นในโปรแกรมแก้ไขข้อความและคลิกปุ่ม "ตัวอย่างโค้ด" ({}) บนแถบเครื่องมือตัวแก้ไขหรือใช้ Ctrl + K บนแป้นพิมพ์เพื่อจัดรูปแบบให้สวยงาม และเน้นไวยากรณ์!
WhatsThePoint

1
เช่นเดียวกับคำตอบของ Brandtware stackoverflow.com/a/47528230/52277
Michael Freidgeim

-1

ด้วย EF 7:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
Column(TypeName = "datetime2")]
DateTime? Dateadded { get; set; }

สคริปต์การโยกย้าย:

AlterColumn("myschema.mytable", "Dateadded", c => c.DateTime(nullable: false, precision: 7, storeType: "datetime2", defaultValueSql: "getutcdate()"));

ผลลัพธ์:

ALTER TABLE [MySchema].[MyTable] ADD  CONSTRAINT [DF_MySchema.MyTable_Dateadded]  DEFAULT (getutcdate()) FOR [Dateadded]

ไม่มี EF 7 คอลัมน์ DateTime ไม่สามารถเป็นข้อมูลประจำตัวและคำอธิบายประกอบจะไม่สร้างสคริปต์การย้ายข้อมูลนั้น และไม่จำเป็นต้องแก้ไขสคริปต์การย้ายข้อมูลด้วยตนเองหากนั่นคือสิ่งที่คุณหมายถึง มีคำอธิบายประกอบที่เพิ่มค่าเริ่มต้นตามที่ได้รับคำตอบแล้วที่นี่
Gert Arnold

-6

ฉันต้องการสิ่งนี้และหาวิธีแก้ปัญหานี้ด้วย (ฉันใช้เฉพาะส่วนวันที่ - เวลาเริ่มต้นไม่สมเหตุสมผลเป็นค่าเริ่มต้นของ PropertyGrid):

public class DefaultDateAttribute : DefaultValueAttribute {
  public DefaultDateAttribute(short yearoffset)
    : base(DateTime.Now.AddYears(yearoffset).Date) {
  }
}

นี่เป็นการสร้างแอตทริบิวต์ใหม่ที่คุณสามารถเพิ่มลงในคุณสมบัติ DateTime ของคุณ เช่นถ้าค่าเริ่มต้นเป็น DateTime.Now.Date:

[DefaultDate(0)]

33
คำเตือน!!!!!! สิ่งนี้แย่มากและควรลบออกจาก SO ฉันใช้เวลาหลายชั่วโมงในการแก้ไขปัญหาที่เกิดจากคำแนะนำนี้ เมื่อมองแวบแรกก็ดูดีและดูเหมือนว่าจะทำงานได้ แต่นี่เป็นกับดัก แอตทริบิวต์ต้องการค่าคงที่ด้วยเหตุผล พวกเขาจะเริ่มต้นครั้งเดียว หลังจากนั้นค่าจะเปลี่ยนไป ดังนั้นในขณะที่อินสแตนซ์แรกที่คุณสร้างจะดูดีและอินสแตนซ์ที่ตามมาจะดูดี แต่อินสแตนซ์เหล่านี้ทั้งหมดใช้ค่าแรกจริงๆ เมื่อแอปของคุณทำงานได้สักพักคุณจะสังเกตเห็นปัญหาและสงสัยว่าทำไม และในการดีบักเมื่อคุณเรียกใช้งานไปหนึ่งนาทีมันจะทำงานได้ดี ระวัง!
Chris Hynes

3
คริสพูดถูก ฉันพบปัญหาเดียวกัน อย่าใช้คำตอบนี้
sohtimsso1970
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.