Entity Framework 7でON DELETE NO ACTIONを指定していますか?

entity-framework-core

質問

Entity Framework 7で移行を適用しようとしたときにエラーが発生する

FOREIGN KEY制約 'FK_ChangeOrder_User_CreatedByID'を 'ChangeOrder'テーブルに導入すると、サイクルまたは複数のカスケードパスが発生する可能性があります。 NO DELETE NO ACTIONまたはUP UP NO NO ACTIONを指定するか、他のFOREIGN KEY制約を変更してください。
制約を作成できませんでした。以前のエラーを参照してください。

古いバージョンのEntity Frameworkでは、これを

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

DbContextにしかしEF7にmodelBuilder持っていないようです.ConventionsそれまでとGoogleは唯一の古いEF 4つのしかしEF 6の結果を返しています。

Entity Framework 7のON DELETE NO ACTION制約を具体的にどのようにしますか?

編集:Olegが提供する答えは明らかに外部キーごとに行いますが、これをグローバルに宣言するために1行のコードを使用する方がはるかに簡単で、次にコードを指定する必要があります。何百もの人間関係が結びつくだろう。

編集2:Olegのコード

public class ChangeOrder
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public Int16? ApprovedByID { get; set; }
    public Byte ApprovalStatusID { get; set; }
    public Int16 AssignedToID { get; set; }
    public Int16 CreatedByID { get; set; }
    public Byte CurrentStatusID { get; set; }
    public DateTime? DateApproved { get; set; }
    public DateTime? EndDate { get; set; }
    public Byte ImpactID { get; set; }
    public Byte PriorityID { get; set; }
    public DateTime? StartDate { get; set; }
    public Byte TypeID { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string ReasonForChange { get; set; }

    [ForeignKey("ApprovedByID")]
    public User ApprovedBy { get; set; }

    [ForeignKey("ApprovalStatusID")]
    public ChangeApprovalStatus ApprovalStatus { get; set; }

    [ForeignKey("AssignedToID")]
    public User AssignedTo { get; set; }

    [ForeignKey("CreatedByID")]
    public User CreatedBy { get; set; }

    [ForeignKey("ImpactID")]
    public ChangeImpact Impact { get; set; }

    [ForeignKey("PriorityID")]
    public ChangePriority Priority { get; set; }

    [ForeignKey("TypeID")]
    public ChangeType ChangeType { get; set; }

    [ForeignKey("CurrentStatusID")]
    public ChangeStatus CurrentStatus { get; set; }
}
public class JobSightDBContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelbuilder)
    {
        base.OnModelCreating(modelbuilder);
    }

    DbSet<ChangeApprovalStatus> ChangeApprovalStatus { get; set; }
    DbSet<ChangeImpact> ChangeImapct { get; set; }
    DbSet<ChangeOrder> ChangeOrders { get; set; }
    DbSet<ChangePriority> ChangePriorities { get; set; }
    DbSet<ChangeStatus> ChangeStatus { get; set; }
    DbSet<ChangeType> ChangeTypes { get; set; }
    DbSet<User> Users { get; set; }
}

受け入れられた回答

GitHubを掘り下げてそこからMSの非常に患者さんと一緒に作業した後、現在の解決策はこれをDbContextに追加することです

protected override void OnModelCreating(ModelBuilder modelbuilder)
{
    foreach (var relationship in modelbuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
    {
        relationship.DeleteBehavior = DeleteBehavior.Restrict;
    }

    base.OnModelCreating(modelbuilder);
}

人気のある回答

建設

modelBuilder.Entity("myNamespace.Models.ChangeOrder", b =>
    {
        b.HasOne("myNamespace.Models.User")
            .WithMany()
            .HasForeignKey("CreatedByID")
            .OnDelete(DeleteBehavior.Cascade);
    });

REFERENCES [dbo].[User] ([CreatedByID]) ON DELETE CASCADE FK_ChangeOrder_User_CreatedByID REFERENCES [dbo].[User] ([CreatedByID]) ON DELETE CASCADEを作成することを意味しREFERENCES [dbo].[User] ([CreatedByID]) ON DELETE CASCADE 。これは、中に存在するはずprotected override void BuildModel(ModelBuilder modelBuilder)YourContextModelSnapshot.cs移行中に作成しました。あなたの質問を完全に理解しているかどうかはわかりませんが、 XXXModelSnapshot.csそのような構造を追加するか、ここに既に存在する不要な構造を削除する必要があります。

最新の情報:モデルに問題があることがわかりました。あなたは以下の特性を持っています:

public Int16? ApprovedByID { get; set; }
public Int16 AssignedToID { get; set; }
public Int16 CreatedByID { get; set; }

// navigation properties

[ForeignKey("ApprovedByID")]
public User ApprovedBy { get; set; }

[ForeignKey("AssignedToID")]
public User AssignedTo { get; set; }

[ForeignKey("CreatedByID")]
public User CreatedBy { get; set; }

デフォルトでは、すべてのプロパティでDeleteBehavior.Cascadeを設定してください。

あなたは、変更することで動作を上書きすることができますOnModelCreatingいずれかの設定、 DeleteBehavior.Restrictすべてのキーの動作やキーだけ1に設定するDeleteBehavior.CascadeまたはDeleteBehavior.SetNull行動を。たとえば、次のコードでは、 DeleteBehavior.CascadeCreatedByID (外部キーにON DELETE CASCADEを作成)で、 DeleteBehavior.Restrictを他の外部キー(外部キーではON DELETEなし)で使用しています。

public class JobSightDBContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelbuilder)
    {
        base.OnModelCreating(modelbuilder);

        modelbuilder.Entity(typeof (ChangeOrder))
            .HasOne(typeof (User), "ApprovedBy")
            .WithMany()
            .HasForeignKey("ApprovedByID")
            .OnDelete(DeleteBehavior.Restrict); // no ON DELETE
        modelbuilder.Entity(typeof (ChangeOrder))
            .HasOne(typeof (User), "AssignedTo")
            .WithMany()
            .HasForeignKey("AssignedToID")
            .OnDelete(DeleteBehavior.Restrict); // no ON DELETE
        modelbuilder.Entity(typeof (ChangeOrder))
            .HasOne(typeof (User), "CreatedBy")
            .WithMany()
            .HasForeignKey("CreatedByID")
            .OnDelete(DeleteBehavior.Cascade); // set ON DELETE CASCADE
    }

    DbSet<ChangeApprovalStatus> ChangeApprovalStatus { get; set; }
    DbSet<ChangeImpact> ChangeImapct { get; set; }
    DbSet<ChangeOrder> ChangeOrders { get; set; }
    DbSet<ChangePriority> ChangePriorities { get; set; }
    DbSet<ChangeStatus> ChangeStatus { get; set; }
    DbSet<ChangeType> ChangeTypes { get; set; }
    DbSet<User> Users { get; set; }
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ