Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting the default value of a DateTime Property to DateTime.Now inside the System.ComponentModel Default Value Attrbute

People also ask

What is the default value for datetime?

The default and the lowest value of a DateTime object is January 1, 0001 00:00:00 (midnight).

How do I change the default value for EF core?

In EF core released 27th June 2016 you can use fluent API for setting default value. Go to ApplicationDbContext class, find/create the method name OnModelCreating and add the following fluent API.

What is the default value for date in MySQL?

MySQL retrieves and displays DATE values in 'YYYY-MM-DD' format. The supported range is '1000-01-01' to '9999-12-31'. even if they also say: Invalid DATE, DATETIME, or TIMESTAMP values are converted to the “zero” value of the appropriate type ('0000-00-00' or '0000-00-00 00:00:00').


You cannot do this with an attribute because they are just meta information generated at compile time. Just add code to the constructor to initialize the date if required, create a trigger and handle missing values in the database, or implement the getter in a way that it returns DateTime.Now if the backing field is not initialized.

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

   set { this.dateCreated = value; }
}

private DateTime? dateCreated = null;

Add below to the DateTime property

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]

I have tested this on EF core 2.1

Here you cannot use either Conventions or Data Annotations. You must use the Fluent 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()");
    }
}

Official doc


There's no reason I can come up with that it shouldn't be possible to do through an attribute. It might be in Microsoft's backlog. Who knows.

The best solution I have found is to use the defaultValueSql parameter in the code first migration.

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

I don't like the often reference solution of setting it in the entity class constructor because if anything other than Entity Framework sticks a record in that table, the date field won't get a default value. And the idea of using a trigger to handle that case just seems wrong to me.


It is possible and quite simple:

for DateTime.MinValue

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

for any other value as last argument of DefaultValueAttribute specify string that represent desired DateTime value.

This value must be constant expression and is required to create object (DateTime) using TypeConverter.