您必须在重新创建迁移后删除数据库并更新数据库。但是如果你想更新你的数据库表,你可以创建另一个迁移并更新数据库而不删除现有的“InitialMigration”。
在您的实体中添加属性后,创建新的迁移,输出将如下所示;
public partial class UpdateDatabase : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "Description",
table: "Category",
type: "longtext CHARACTER SET utf8mb4",
nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Description",
table: "Category");
}
}
您可以使用 Update-Database 命令更新数据库;
yourDbContextObject.Database.Migrate();
您应该会看到向数据库中的所有行添加了具有空值的新列。
或者,您可以在您的属性上添加自定义属性,如下所示;
/// <summary>
/// Attribute for adding default value in context level.
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class MilvaDefaultValueAttribute : Attribute
{
/// <summary>
/// Specifies this property has a default value upon creation.
/// </summary>
/// <param name="defaultValue">The default value of the property.</param>
public MilvaDefaultValueAttribute(object defaultValue)
{
DefaultValue = defaultValue;
}
/// <summary>
/// Default value of tagged property.
/// </summary>
public object DefaultValue { get; private set; }
}
public class Category : BaseEntity
{
[MilvaEncrypted]
public string Name { get; set; }
[MilvaDefaultValue("Default value added.")]
public string Description { get; set; }
public List<Todo> Todos { get; set; }
}
并在您的 DbContext 中覆盖 OnModelCreating 方法并在下面使用此扩展;
public static void ConfigureDefaultValue(this ModelBuilder modelBuilder)
{
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
foreach (var property in entityType.GetProperties())
{
var memberInfo = property.PropertyInfo ?? (MemberInfo)property.FieldInfo;
if (memberInfo == null) continue;
var defaultValue = Attribute.GetCustomAttribute(memberInfo, typeof(MilvaDefaultValueAttribute)) as MilvaDefaultValueAttribute;
if (defaultValue == null) continue;
modelBuilder.Entity(entityType.ClrType).Property(property.Name).HasDefaultValue(defaultValue.DefaultValue);
}
}
my library 中的这个属性和扩展方法。由于没有时间,我无法添加文档,但代码中有文档,并且 github 项目中存在示例应用程序。
希望能帮到你。