EF5 Code First自动迁移:重命名主键会出错:每个表中的列名必须是唯一的

时间:2017-08-21 11:56:36

标签: sql-server entity-framework primary-key rename

我有一个带有主键Relations的实体RelId。我想将此密钥更改为RelationId

首先,我更改了SSMS中的Columname: SQL Table

然后我在所有参考文献中使用(在Visual Studio中)重命名将单词RelId更改为RelationId

我认为数据库和代码中的更改会说服我的代码使用新命名的主键,但是当我运行项目时会出现以下错误:

  

每个表中的列名必须是唯一的。列名称' RelationId'在表格中,dbo。'被指定不止一次。

当然,情况并非如此。在表中,列RelationId仅存在一次。就像EF5试图添加另一个具有相同名称的列一样。

任何人都可以解释为什么会出现此错误以及如何解决此问题?

Global.asax中

protected void Application_Start()
    {

        //Database.SetInitializer<OefenfirmaContext>(new OefenfirmaDropCreateAndSeed());
        Database.SetInitializer<OefenfirmaContext>(new OefenfirmaDropCreateAndSeed());

        ViewEngines.Engines.Clear();
        ViewEngines.Engines.Add(new RazorViewEngine());

        AreaRegistration.RegisterAllAreas();
        RouteConfig.RegisterRoutes(RouteTable.Routes);

        ModelBinders.Binders.Add(typeof(ShoppingCart), new CartModelBinder());
    }

和OefenfirmaDropCreateAndSeed类(不再播种):

public class OefenfirmaDropCreateAndSeed : 
    MigrateDatabaseToLatestVersion<OefenfirmaContext, Migrations.Configuration>
{
}

1 个答案:

答案 0 :(得分:0)

您正在使用添加迁移吗?那么,您不需要使用手动脚本手动更新数据库端。您应该仅在Add-Migration脚本中执行此操作。如果手动运行数据库端重命名列的脚本,则现有系统生成的MigrationScripts和数据库将不同步。因此,在运行/回滚新/旧迁移脚本时,最终会出错。根据我的理解,请尝试以下步骤

步骤1:在Visual Studio代码中重命名模型类的主键( RelId to RelationId)。

第2步:程序包管理器控制台中运行添加 - 迁移RenameMyColumn 系统将根据模型更改生成Migrationscripts下方。

注意:请在生成的系统中验证系统生成的 AddColumn DropColumn ,而不是 RenameColumn 脚本,如下所示迁移脚本。如果是,请手动删除AddColumn和DropColumn脚本,并在向上()向下()方法中添加 RenameColumn()脚本重命名的主键属性。

namespace MyProject.Model.Migrations
{
   using System;
   using System.Data.Entity.Migrations;

   public partial class RenameMyColumn : DbMigration
   {
     public override void Up()
     {
        // Remove the following auto-generated lines(Note:These scripts generated for an example purpose not for primary key)
        AddColumn("dbo.MyTable", "NewColumn", c => c.String(nullable: false, maxLength: 50));
        DropColumn("dbo.MyTable", "OldColumn");

        // Add this line
        RenameColumn("dbo.MyTable", "OldColumn", "NewColumn");
    }

    public override void Down()
    {
        // Remove the following auto-generated lines(Note:These scripts generated for an example purpose not for primary key)
        AddColumn("dbo.MyTable", "OldColumn", c => c.String(nullable: false, maxLength: 50));
        DropColumn("dbo.MyTable", "NewColumn");

        // Add this line
        RenameColumn("dbo.MyTable", "NewColumn", "OldColumn");
    }
  }
}

希望这可以帮助你前进!