Reputation: 13945
I have an existing table / model into which I want to add a new Boolean column. This table already has many hundreds of rows of data, and I can't touch the existing data. But.. This column will NOT be nullable, so I need to provide a default value of true
to all the rows that currently exist.
public class Revision
{
...
public Boolean IsReleased { get; set; }
....
}
IMPORTANT:
(This was in the OP, but people seemed to miss is.)
When databases are updated with the migration, all existing rows which receive this new column MUST have their values set to True.
Upvotes: 42
Views: 86030
Reputation: 603
Since migrations don't take any notice of the Auto properties (per the rescinded answer above), even in .Net/EF 8, the best way to do this is within the OnModelCreating
method for the Data Context:
modelBuilder.Entity<Revision>().Property(e => e.IsReleased).HasDefaultValue(true);
Upvotes: 1
Reputation: 15322
You can avoid using fields and take advantage of Auto-property initialization, a feature new in C# 6.
This will set the default value to true
when the column is added to your database.
public class Revision
{
...
public Boolean IsReleased { get; set; } = true;
....
}
Edit to include @BrewMate's comment:
If all of your values set to false when you update the database, make sure to have the JSON formatter handle default values. The JSON formatter will ignore default values by default and then your database is setting the boolean to its default value,
false
. See the link below, I would try Default as the enumeration: http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DefaultValueHandling.htm
Upvotes: 45
Reputation: 1153
According to the MSDN, DefaultValueAttribute specifies the default value for a property. You can use DefaultValueAttribute as the following:
public class Revision
{
...
[DefaultValue(true)]
public Boolean IsReleased { get; set; } = true;
....
}
Furthermore you can use UP() method inside of DbMigration class as the following:
public partial class InitializeDb : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Revision",
c => new
{
Id = c.Int(nullable: false, identity: true),
...
IsReleased = c.Boolean(nullable: false, defaultValue: true),
...
})
.PrimaryKey(t => t.Id);
}
}
You should add "defaultValue: true" by yourself.
Upvotes: 17
Reputation: 1461
You can simply avoid auto-implemented properties and set the property value to true
when you initialize your object.
private Boolean _isReleased = true;
public Boolean IsReleased
{
get
{
return _isReleased;
}
set
{
_isReleased = value;
}
}
Upvotes: -2
Reputation: 39326
Another option is create a default constructor and set the properties with the default values you need:
public class Revision
{
public Boolean IsReleased { get; set; }
public Revision()
{
IsReleased=true;
}
}
To set the values to true
of the existing rows when you run Update-Database
command, you could do this in your Configuration
class:
protected override void Seed(YourContext context)
{
var entities=context.Revisions.Where(r=>!r.IsReleased)
foreach(var e in entities)
{
e.IsReleased=true;
//context.Entry(e).State = EntityState.Modified; If you have disabled change tracking then add this line
}
context.SaveChanges();
}
If it is a new column you are adding via migration maybe you can also do this:
AddColumn("dbo.Revisions", "IsReleased", c => c.Boolean(nullable: false, defaultValue: true));
Upvotes: 43