Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL column default value with Entity Framework

Tags:

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.

like image 972
Carl Avatar asked Nov 20 '14 11:11

Carl


1 Answers

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

like image 137
Faris Zacina Avatar answered Oct 11 '22 12:10

Faris Zacina