如何解决EntityFrameWork 迁移 Asp.net Core 2.0
我有一个 Asp.Net core 2.0 项目,带有 Entity Framework Core 2.0Version。我有一个现有的数据库。现在进入 packagemanager 控制台窗口:Add-Migration 然后 Name:InitialMigration 之后 在我的项目中添加了迁移文件夹。然后我在包管理器控制台窗口中输入 Update-Database 注释。 '表已存在' 错误消息显示。因为我的数据库中已经有那个表了。
我的要求是在现有模型中添加或删除属性时,该属性会在现有数据库中自动更新。我该怎么做?
解决方法
您必须在重新创建迁移后删除数据库并更新数据库。但是如果你想更新你的数据库表,你可以创建另一个迁移和更新数据库,而无需删除现有的“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 项目中。
希望能帮到你。
,以下步骤可能对您有用!
Remove-Migration InitialMigration
Add-Migration name_of_new_migration
Update-Database -Force
如果上述步骤不起作用,请尝试以下步骤:
Add-Migration Initial -IgnoreChanges
这将创建一个空白的迁移脚本
Update-Database
这会将数据库更新到此迁移,但不会应用任何更改。您现在可以将更改添加到数据库上下文中。完成后执行以下步骤。
Add-Migration name_of_new_migration
这将生成一个包含您所做更改的新迁移脚本。然后再次更新您的数据库。
Update-Database
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。