问题
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)?
回答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()"));
回答2:
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"));
回答3:
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.
4) Set the default value.
public override void Up()
{
AddColumn("dbo.AspNetUsers", "IsEnabled", c => c.Boolean(nullable: false, defaultValue: true));
}
回答4:
I have resolved this problem by overriding the SaveChanges method. See below for my solution.
Solution Explain
i) Override the SaveChanges method in the DbContext class.
public override int SaveChanges() { return base.SaveChanges(); }
ii) Write logic to set default values
public override int SaveChanges() { //set default value for your property foreach (var entry in ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty("YOUR_PROPERTY") != null)) { if (entry.State == EntityState.Added) { if (entry.Property("YOUR_PROPERTY").CurrentValue == null) entry.Property("YOUR_PROPERTY").CurrentValue = YOUR_DEFAULT_VALUE; } } return base.SaveChanges(); }
Example
public override int SaveChanges() { //set default value for RegistedDate property foreach (var entry in ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty("RegistedDate") != null)) { if (entry.State == EntityState.Added) { if ((DateTime)entry.Property("RegistedDate").CurrentValue == DateTime.MinValue) entry.Property("RegistedDate").CurrentValue = DateTime.Now; } } //set default value for IsActive property foreach (var entry in ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty("IsActive") != null)) { if (entry.State == EntityState.Added) { if(entry.Property("IsActive").CurrentValue == null) entry.Property("IsActive").CurrentValue = false; } } return base.SaveChanges(); }
回答5:
I found that just using Auto-Property Initializer on entity property is enough to get the job done.
For example:
public class Thing {
public bool IsBigThing { get; set; } = false;
}
来源:https://stackoverflow.com/questions/31025967/code-first-migration-how-to-set-default-value-for-new-property