2017-08-30 17 views
0

私はEntity Framework 6プロジェクトのWEB API 2で作業中で、update-databaseの後に問題があります。Entity Framework 6の 'update-database'の後のエラー

エラー:私は問題です見当がつかない

public class User 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id_User { get; set; } 
    public int Id_List_Products { get; set; } 
    public int Id_List_Black_Products { get; set; } 
    public string Login { get; set; } 
    public string Email { get; set; } 
    public string Password { get; set; } 
    public Boolean Social_Account { get; set; } // 1 - social account, 0 - normal account 
    public string URL_Avatar { get; set; } //URL of avatar thumbnail 

    public virtual List_Products List_Products { get; set; } 
    public virtual List_Black_Products List_Black_Products { get; set; } 
} 

public class Rate 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int Id_Rate { get; set; } 
     public int Id_User { get; set; } 
     public int Id_Recipe { get; set; } 
     public int Value_Rate { get; set; } //1-5 

     public virtual User User { get; set; } 
     public virtual Recipe Recipe { get; set; } 
    } 

と私のUserクラス:

Introducing FOREIGN KEY constraint 'FK_dbo.Rates_dbo.Users_Id_User' on table 'Rates' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. 
Could not create constraint or index. See previous errors. 

はここに私のレートクラスです。 ヒント?

+0

あなたのConnectionString Modelクラスを投稿..あなたはどうするかを指定する必要があります 'modelBuilder' –

+0

を含むものレートを削除すると、ユーザーに表示されます。ユーザー参照レートとレート参照ユーザーがある場合、カスケード削除によって問題が発生します。 –

+0

[Entity Frameworkの可能な複製:「FOREIGN KEY制約がサイクルまたは複数のカスケードパスを引き起こす可能性がある」解決方法?](https://stackoverflow.com/questions/14489676/entity-framework-how-to-solve-foreign-キー制約 - 原因 - サイクル - または - マルチ) –

答えて

1

この問題は、リレーションシップの複数の経路が原因で発生します。あるレコードを削除すると、別のテーブルの他のレコードが削除され、別のテーブルのレコードが削除され、そのテーブルからレコードが削除され、サイクルが繰り返されます。本当に破局的な、開発者の最悪の悪夢。この問題に対処するには、カスタム属性を追加し、例えば、移行中:

CreateTable(
      "dbo.SomeTable", 
      c => new 
      { 
       id = c.Int(nullable: false, identity: true), 
       createdon = c.DateTime(), 
       createdby = c.String(), 
      }) 
      .PrimaryKey(t => t.id) 
      .ForeignKey("dbo.Customers", t => t.Customerid, cascadeDelete: true) 
      .ForeignKey("dbo.AnotherTable", t => t.Anotherid, cascadeDelete: false) 
      .Index(t => t.Customerid) 
      .Index(t => t.Scopeid); 

は、影響を受ける表/(モデルクラスバッキング)のfalseからfalseAutoUpdatecascadeDeleteを設定し、それに応じてデータベースを更新します。単純に例えば、あなたの関係が環状である、入れ

: - >給与 - >給与 - お客様>カスタマー ですから、顧客を削除すると、そのそれぞれの給与レコード(複数可)/削除され削除されていますリンクされた顧客を削除することにループバックし、このサイクルは繰り返し混乱を引き起こし続けます。したがって、Entity FrameworkとSQLはこれをよく理解し、影響を受ける/エラーを引き起こす削除/更新接続を無効にするようユーザーに促します。

0

オーケー、私はfalseにcascadeDeleteを変更:

CreateTable(
      "dbo.Rates", 
      c => new 
       { 
        Id_Rate = c.Int(nullable: false, identity: true), 
        Id_User = c.Int(nullable: false), 
        Id_Recipe = c.Int(nullable: false), 
        Value_Rate = c.Int(nullable: false), 
       }) 
      .PrimaryKey(t => t.Id_Rate) 
      .ForeignKey("dbo.Recipes", t => t.Id_Recipe, cascadeDelete: true) 
      .ForeignKey("dbo.Users", t => t.Id_User, cascadeDelete: false) 
      .Index(t => t.Id_User) 
      .Index(t => t.Id_Recipe); 

、それが動作します。)

関連する問題