Search code examples
.netentity-frameworkentity-framework-6

SQL column default value with Entity Framework


I am trying to use Code-First EF6 with default SQL values.

For example, I have a "CreatedDate" column/property not null with a default in SQL of "getdate()"

How do I represent this in my code Model? Currently I have:

<DatabaseGenerated(DatabaseGeneratedOption.Computed)>
Public Property CreatedDate As DateTime

Will this work, or will I need to use a nullable even though the actual column should be not null, so EF doesn't send a value when it hasn't been set:

<DatabaseGenerated(DatabaseGeneratedOption.Computed)>
Public Property CreatedDate As DateTime?

Or is there a better solution out there?

I don't want EF to handle my defaults - I know this is available to me but not possible in my current situation.


Solution

  • Currently in EF6 there is not an attribute to define database functions used for a certain property default value. You can vote on Codeplex to get it implemented:

    https://entityframework.codeplex.com/workitem/44

    The accepted way to implement something like that is to use Computed properties with Migrations where you specify the default database function.

    Your class could look like this in C#:

    public class MyEntity
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
    
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public DateTime Created { get; set; }
    }
    

    The computed property doesn't have to be nullable.

    Then you have to run a migration and modify it by hand to include the default SQL function. A migration could look like:

    public partial class Initial : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.MyEntities",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Name = c.String(),
                        Created = c.DateTime(nullable: false, defaultValueSql: "GetDate()"),
                    })
                .PrimaryKey(t => t.Id);
    
        }
    
        public override void Down()
        {
            DropTable("dbo.MyEntities");
        }
    }
    

    You will notice the defaultValueSql function. That is the key to get the computation working