2013-07-30 21 views
9

と競合ALTER TABLE文私は、次の方法でこれらのクラスを変更し、これらのクラスEF移行:FOREIGN KEY制約

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 : ... 
{ 
    ... 
} 

ときIでした更新データベース次のエラーが発生しました

ALTER TA BLEステートメントがFOREIGN KEY制約 "FK_dbo.Bid_dbo.TraderUser_TraderUser_Id"と競合しました。競合は データベース "LeasePlan.Development"、テーブル "dbo.TraderUser"、列 'Id'で発生しました。

データベースを更新することができません。どんな助けでも大歓迎です。

+0

これらの3つのクラスの間でどのような関係を達成しようとしていますか? 'TraderCompany'クラスには何らかのプロパティがありますか? – SOfanatic

+0

入札にはトレーダー・ユーザーがあり、トレーダー・ユーザーにはトレーダー・カンパニーがあります。 TraderCompanyには2つの文字列プロパティしかありません。 –

答えて

24

それが遅すぎるかどうかわかりませんが、私は同じ問題があって、おそらくこれがあなたに役立つかもしれません。

あなたの投稿からは見えませんが、TraderUserテーブルにはすでにいくつかの行が挿入されている可能性があります。あなたが達成しようとしているのは、新しいテーブルTraderCompanyを作成し、TraderUser内でTraderCompanyテーブルを指す外部キー関係を作成することです。

1つの移行では、すでにデータが含まれている表に対して、NULL値を設定できない外部キー関係を作成しようとしています。

あなたは以下を試みることができる:

  • まず移行 -

    public int TraderCompanyId { get; set; } 
    

    これは、あなたがNULL可能で作成することができます

    public int? TraderCompanyId { get; set; } 
    

    である必要があり、この行を除いて、すべて同じ外部キー列。

  • 既存データのTraderCompanyId列を、TraderCompanyテーブルの一部の行で更新します。

  • 第二に移行 -

    public int TraderCompanyId { get; set; } 
    

    public int? TraderCompanyId { get; set; } 
    

    から変更コードとあなたの移行を実行します。

私はこれがあなたに役立つことを願っています。

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"); 
関連する問題