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

Sql server 如何先更改EF代码中外键的数据类型,sql-server,entity-framework,code-first,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; }

我有两种型号

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; }    
}
如您所见,
ContractTypeId
JobPost
表中的外键

然后,我首先用代码将它们更新到数据库中

但是我刚刚决定使用
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);
    }
但是,当我使用
updatedatabase
更新数据库时,我得到一个错误:

错误编号:206,状态:2,类别:16
操作数类型冲突:uniqueidentifier与int不兼容

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

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


谢谢大家

给你们。因为您没有好的数据:)棘手的是首先删除列,然后再次添加它们。因为我们不能将uniquiueidentifier更改为int直接阅读前面提到的文章 . 因此,我采用了迁移:)可能对其他喜欢先从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);
    }

给你。因为您没有好的数据:)棘手的是首先删除列,然后再次添加它们。因为我们不能将uniquiueidentifier更改为int直接阅读前面提到的文章 . 因此,我采用了迁移:)可能对其他喜欢先从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);
    }

添加了我在本地EF 6.1.3上测试的答案,重试几次后就成功了:)顺便提一句,这个问题很好,对那些喜欢先在EF代码中测试的人很有帮助。@YashveerSingh谢谢你的回答,我今晚就试试!!好的,没问题,我希望它能起作用:)添加了我在本地EF 6.1.3上测试的答案,重试几次后它就起作用了:)顺便提一句,这个问题很好,对那些喜欢先在EF代码中进行测试的人很有帮助。@YashveerSingh谢谢你的回复,我今晚会试试!!好的,没问题,我希望它能工作:)