如何在EF代码中首先更改外键的数据类型

时间:2017-01-22 09:06:37

标签: sql-server entity-framework code-first

我有两个型号

public class ContractType
{
    public Guid ContractTypeId { get; set; }
    public string Name { get; set; }
}

public class JobPost : BasePost
{
    public ContractType ContractType { get; set; }
    public Guid ContractTypeId { get; set; }    
}

正如您所看到的,ContractTypeIdJobPost表中的外键。

然后,我使用代码优先将它们更新到数据库。

但我刚决定int代替ContractTypeId而不是Guid。所以我只是将ContractTypeId的数据类型更改为int并添加了迁移。两个表都没有数据。这就是我得到的

    public override void Up()
    {
        DropForeignKey("dbo.JobPosts", "ContractTypeId", "dbo.ContractTypes");
        DropIndex("dbo.JobPosts", new[] { "ContractTypeId" });
        DropPrimaryKey("dbo.ContractTypes");
        AlterColumn("dbo.ContractTypes", "ContractTypeId", c => c.Int(nullable: false, identity: true));
        AlterColumn("dbo.JobPosts", "ContractTypeId", c => c.Int(nullable: false));
        AddPrimaryKey("dbo.ContractTypes", "ContractTypeId");
        CreateIndex("dbo.JobPosts", "ContractTypeId");
        AddForeignKey("dbo.JobPosts", "ContractTypeId", "dbo.ContractTypes", "ContractTypeId", cascadeDelete: true);
    }

    public override void Down()
    {
        DropForeignKey("dbo.JobPosts", "ContractTypeId", "dbo.ContractTypes");
        DropIndex("dbo.JobPosts", new[] { "ContractTypeId" });
        DropPrimaryKey("dbo.ContractTypes");
        AlterColumn("dbo.JobPosts", "ContractTypeId", c => c.Guid(nullable: false));
        AlterColumn("dbo.ContractTypes", "ContractTypeId", c => c.Guid(nullable: false));
        AddPrimaryKey("dbo.ContractTypes", "ContractTypeId");
        CreateIndex("dbo.JobPosts", "ContractTypeId");
        AddForeignKey("dbo.JobPosts", "ContractTypeId", "dbo.ContractTypes", "ContractTypeId", cascadeDelete: true);
    }

但是,当我使用update-database更新数据库时,出现错误:

  

错误号码:206,状态:2,等级:16
  操作数类型冲突:uniqueidentifier与int

不兼容

我知道因为我还没有为表格填充任何数据,所以我可以简单地删除并重新创建模型并更新它们。

但我想知道如何解决这个问题或如何更改ContractTypeId的数据类型。

谢谢你们

1 个答案:

答案 0 :(得分:0)

你去吧。因为你没有好的数据:)狡猾的是首先删除列并再次添加它们。但是我们不能将uniquiueidentitfier更改为int直接读取几个帖子,其中提到了  Change datatype of column to uniqueidentifier from bigint。因此我采用了迁移:)可能对其他喜欢先从EF代码执行此操作的人有所帮助。

public override void Up()
    {
        DropForeignKey("dbo.JobPosts", "ContractTypeId", "dbo.ContractTypes");
        DropIndex("dbo.JobPosts", new[] { "ContractTypeId" });
        DropPrimaryKey("dbo.ContractTypes");


        -- below line added manaully
        DropColumn("dbo.ContractTypes", "ContractTypeId");
        -- below line added manaully
        AddColumn("dbo.ContractTypes", "ContractTypeId", c => c.Int(nullable: false, identity: true));

        -- below line added manaully
        DropColumn("dbo.JobPosts", "ContractTypeId");

        -- below line added manaully
        AddColumn("dbo.JobPosts", "ContractTypeId", c => c.Int(nullable: false));


        AddPrimaryKey("dbo.ContractTypes", "ContractTypeId");
        CreateIndex("dbo.JobPosts", "ContractTypeId");
        AddForeignKey("dbo.JobPosts", "ContractTypeId", "dbo.ContractTypes", "ContractTypeId", cascadeDelete: true);
    }