微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EntityFrameWork 迁移 Asp.net Core 2.0

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?