EF迁移:ALTER TABLE语句与FOREIGN KEY约束冲突

时间:2013-07-30 12:24:07

标签: entity-framework-5

我有这些课程

public class Bid : ...
{
   ...

   [Required]
   public virtual TraderUser Trader { get; set; }
}

public class TraderUser : ...
{
   ...
}

然后我按照以下方式更改了这些类,并添加了一个新类

public class Bid : ...
{
   ...

   [Required]
   public virtual TraderUser TraderUser { get; set; }
}

public class TraderUser : ...
{
   ...

   public int TraderCompanyId { get; set; }

   [ForeignKey("TraderCompanyId")]
   public virtual TraderCompany TraderCompany { get; set; }
}

public class TraderCompany : ...
{
   ...
}

当我执行更新数据库时,我收到以下错误

  

ALTER TABLE语句与FOREIGN KEY约束冲突   “FK_dbo.Bid_dbo.TraderUser_TraderUser_Id”。冲突发生在   数据库“LeasePlan.Development”,表“dbo.TraderUser”,列'Id'。

我无法让数据库更新。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:27)

不知道是否为时已晚,但我有同样的问题,也许这可以帮到你。

我无法从您的帖子中看到,但可能您的TraderUser表中已插入了一些行。您要完成的是创建新表TraderCompany并在TraderUser中创建指向TraderCompany表的外键关系。

在一次迁移中,您尝试为已包含数据的表创建不可为空的外键关系。

您可以尝试以下方法:

  • 第一次迁移 - 除此行外的所有内容

    public int TraderCompanyId { get; set; } 
    

    应该是

    public int? TraderCompanyId { get; set; }
    

    这将允许您创建可为空的外键列。

  • 使用TraderCompany表中的某一行更新现有数据的TraderCompanyId列。

  • 第二次迁移 - 从

    更改代码
    public int? TraderCompanyId { get; set; }
    

    public int TraderCompanyId { get; set; }
    

    并运行迁移。

我希望这会对你有所帮助。

答案 1 :(得分:0)

另一种方法是在迁移代码中添加一条SQL语句,以在添加外键之前插入一行。以下是我所做的一个例子:

        // Countries is a new table
        CreateTable(
            "dbo.Countries",
            c => new
                {
                    CountryID = c.Int(nullable: false, identity: true),
                    Name = c.String(),
                    Currency = c.Int(nullable: false),
                })
            .PrimaryKey(t => t.CountryID);
        // Heres where i insert a row into countries
        Sql("INSERT INTO Countries (Name, Currency) VALUES ('United Kingdom', 0)");
        // I set the default value to 1 on the ID fields
        AddColumn("dbo.Brokers", "CountryID", c => c.Int(nullable: false, defaultValue: 1));
        AddColumn("dbo.Products", "CountryID", c => c.Int(nullable: false, defaultValue: 1));
        AddForeignKey("dbo.Brokers", "CountryID", "dbo.Countries", "CountryID", cascadeDelete: false);
        AddForeignKey("dbo.Products", "CountryID", "dbo.Countries", "CountryID", cascadeDelete: false);
        // Migrations then creates index's
        CreateIndex("dbo.Brokers", "CountryID");
        CreateIndex("dbo.Products", "CountryID");