362

私はしばらくこれに取り組んできましたが、何が起こっているのかよくわかりません。サイド (通常は 2) を含むカード エンティティがあり、カードとサイドの両方にステージがあります。EF Codefirst 移行を使用していますが、移行が次のエラーで失敗しています。

テーブル 'Sides' に FOREIGN KEY 制約 'FK_dbo.Sides_dbo.Cards_CardId' を導入すると、サイクルまたは複数のカスケード パスが発生する可能性があります。ON DELETE NO ACTION または ON UPDATE NO ACTION を指定するか、他の FOREIGN KEY 制約を変更します。

ここに私のカードエンティティがあります:

public class Card
{
    public Card()
    {
        Sides = new Collection<Side>();
        Stage = Stage.ONE;
    }

    [Key]
    [Required]
    public virtual int CardId { get; set; }

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

    [Required]
    [ForeignKey("CardId")]
    public virtual ICollection<Side> Sides { get; set; }
}

これが私のサイドエンティティです:

public class Side
{
    public Side()
    {
        Stage = Stage.ONE;
    }

    [Key]
    [Required]     
    public virtual int SideId { get; set; } 

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

    [Required]
    public int CardId { get; set; }

    [ForeignKey("CardId")]
    public virtual Card Card { get; set; }

}

そして、これが私のStageエンティティです:

public class Stage
{
    // Zero
    public static readonly Stage ONE = new Stage(new TimeSpan(0, 0, 0), "ONE");
    // Ten seconds
    public static readonly Stage TWO = new Stage(new TimeSpan(0, 0, 10), "TWO");

    public static IEnumerable<Stage> Values
    {
        get
        {
            yield return ONE;
            yield return TWO;
        }

    }

    public int StageId { get; set; }
    private readonly TimeSpan span;
    public string Title { get; set; }

    Stage(TimeSpan span, string title)
    {
        this.span = span;
        this.Title = title;
    }

    public TimeSpan Span { get { return span; } }
}

奇妙なのは、ステージ クラスに次のコードを追加した場合です。

    public int? SideId { get; set; }
    [ForeignKey("SideId")]
    public virtual Side Side { get; set; }

移行は正常に実行されます。SSMSを開いてテーブルを見ると、(期待どおり/望ましい)にStage_StageId追加されていることがわかりますが、(予期しない)への参照は含まれていません。 CardsSidesStage

次に追加すると

    [Required]
    [ForeignKey("StageId")]
    public virtual Stage Stage { get; set; }
    public int StageId { get; set; }

Side クラスを見るStageIdと、テーブルに列が追加されていSideます。

これは機能していますが、現在、私のアプリケーション全体で、 への参照にStageは が含まれていますがSideId、これは場合によってはまったく無関係です。 可能であれば、ステージ クラスを参照プロパティで汚染することなく、上記のステージ クラスに基づいたプロパティを自分のエンティティエンティティに与えたいと思いCardSideStageます...何が間違っていますか?

4

19 に答える 19

47

EFコアでそれを行う方法を知りたい人:

      protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
                {
                    relationship.DeleteBehavior = DeleteBehavior.Restrict;
                }
           ..... rest of the code.....
于 2016-12-21T18:10:01.783 に答える
24

cascadeDelete を false または true に設定できます (移行の Up() メソッドで)。あなたの要件に依存します。

AddForeignKey("dbo.Stories", "StatusId", "dbo.Status", "StatusID", cascadeDelete: false);
于 2015-02-21T17:21:28.667 に答える
2
public partial class recommended_books : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.RecommendedBook",
            c => new
                {
                    RecommendedBookID = c.Int(nullable: false, identity: true),
                    CourseID = c.Int(nullable: false),
                    DepartmentID = c.Int(nullable: false),
                    Title = c.String(),
                    Author = c.String(),
                    PublicationDate = c.DateTime(nullable: false),
                })
            .PrimaryKey(t => t.RecommendedBookID)
            .ForeignKey("dbo.Course", t => t.CourseID, cascadeDelete: false) // was true on migration
            .ForeignKey("dbo.Department", t => t.DepartmentID, cascadeDelete: false) // was true on migration
            .Index(t => t.CourseID)
            .Index(t => t.DepartmentID);

    }

    public override void Down()
    {
        DropForeignKey("dbo.RecommendedBook", "DepartmentID", "dbo.Department");
        DropForeignKey("dbo.RecommendedBook", "CourseID", "dbo.Course");
        DropIndex("dbo.RecommendedBook", new[] { "DepartmentID" });
        DropIndex("dbo.RecommendedBook", new[] { "CourseID" });
        DropTable("dbo.RecommendedBook");
    }
}

移行が失敗すると、いくつかのオプションが与えられます: テーブル 'RecommendedBook' に FOREIGN KEY 制約 'FK_dbo.RecommendedBook_dbo.Department_DepartmentID' を導入すると、サイクルまたは複数のカスケード パスが発生する可能性があります。ON DELETE NO ACTION または ON UPDATE NO ACTION を指定するか、他の FOREIGN KEY 制約を変更します。制約またはインデックスを作成できませんでした。以前のエラーを参照してください。

これは、移行ファイルで「cascadeDelete」を false に設定して「他の FOREIGN KEY 制約を変更する」を使用し、「update-database」を実行する例です。

于 2020-02-04T09:42:50.733 に答える
1

これは奇妙に聞こえますが、その理由はわかりませんが、私の場合、 ConnectionString が「。」を使用していたために発生していました。「データソース」属性。「localhost」に変更すると、魅力的に機能しました。他の変更は必要ありませんでした。

于 2015-12-07T15:29:34.617 に答える
-3

私は同じ問題に遭遇し、長い間立ち往生しました。次の手順で救われました。制約を調べて、onDelete ReferentialActionCascadeからNoActionに変更します。

  constraints: table =>
  {
      table.PrimaryKey("PK_table1", x => x.Id);
      table.ForeignKey(
         name: "FK_table1_table2_table2Id",
         column: x => x.table2Id,
         principalTable: "table2",
         principalColumn: "Id",
         onDelete: ReferentialAction.NoAction);
  });
于 2020-11-08T07:56:52.157 に答える