Code-first migration: How to set default value for new property?

57,563

Solution 1

If you see the generated migration code you will see AddColumn

AddColumn("dbo.report", "newProperty", c => c.String(nullable: false));

You can add defaultValue

AddColumn("dbo.report", "newProperty", 
           c => c.String(nullable: false, defaultValue: "old"));

Or add defaultValueSql

AddColumn("dbo.report", "newProperty",
           c => c.String(nullable: false, defaultValueSql: "GETDATE()"));

Solution 2

Hope it helps someone. Putting everything together from previous answers (example using a boolean property):

1) Add a new property to the entity.

/// <summary>
/// Determines if user is enabled or not. Default value is true
/// </summary>
public bool IsEnabled { get; set; }

2) Run the command below to add the new change in the migrations.

add-migration addIsEnabledColumn

3) A migration file is created from the command above, open that file.

enter image description here

4) Set the default value.

public override void Up()
{
        AddColumn(
            "dbo.AspNetUsers", 
            "IsEnabled", 
            c => c.Boolean(
                nullable: false, 
                defaultValue: true
            )
        );
}

Solution 3

You have to change the line in your migration script which adds the the property/column like this:

AddColumn("dbo.reports", "newProperty", c => c.String(nullable: false, defaultValue: "test"));
Share:
57,563
EluciusFTW
Author by

EluciusFTW

Updated on March 02, 2021

Comments

  • EluciusFTW
    EluciusFTW about 3 years

    I am using EF6 for storing instances of the report class in my database. The database already contains data. Say I wanted to add a property to report,

    public class report {
        // ... some previous properties
    
        // ... new property:
        public string newProperty{ get; set; }
    }
    

    Now if I go to the package-manager console and execute

    add-migration Report-added-newProperty
    update-database
    

    I will get a file in the '/Migrations' folder adding a newProperty column to the table. This works fine. However, on the older entries in the database, the value for the newProperty is now an empty string. But I want it to be, e.g., "old".

    So my question is: How do I set default values for new properties (of any type) in the migration script (or elsewhere)?

  • Barry
    Barry about 7 years
    Would be nice if it properly pulled in the [DefaultValue(xyz)] attribute as defined in the code first model. Instead of having to remember which columns need what each time you Add-Migration; having to post-edit the generated file, followed by the normal running of the Update-Database against that changed file. I wonder if it's possible to override that unintelligent behavior.... I can't believe no one has improved on this. Surely I'm not the only one frustrated by this with the default AspNet Identity model... LockoutEnabled, EmailConfirmed, AccessFailedCount. all hardcoded, all problems
  • Efrain
    Efrain over 6 years
    This does not seem to work with MySQL-EF. 'defaultValue' doesn't set the value, and 'defaultValueSql' creates an exception ("blob text geometry or json column can't have a default value") ... the only workaround left is to use raw SQL. :(
  • chipples
    chipples about 6 years
    What's wrong is that it's not actually setting a default value in the database.
  • EeKay
    EeKay almost 6 years
    For those that needed default value for an enum just like me: AddColumn("dbo.report", "newEnumProperty", c => c.Int(nullable: false, defaultValue: 0)); //use integer to set default enum value
  • vinmm
    vinmm almost 4 years
    5) Run Update-Database after step 4 to update the actual database too with the changes. Adding this point just for the sake of newbies.
  • StefanoV
    StefanoV over 3 years
    Quoting @Efrain, with EF Core 5 and MySQL I got empty fields. The default is not applied.
  • user1735921
    user1735921 about 3 years
    How to add default value of other column, eg: I want the new property default vaue to be report.OldProperty ?
  • Dhir Pratap
    Dhir Pratap over 2 years
    Is it possible to have the default be a function of other fields?