2016-01-13 23 views
16

私はエラーFOREIGN KEY制約を紹介Entity Framework 7でON DELETE NO ACTIONを指定していますか? Entity Frameworkの7では

を取得し、マイグレーションを適用しようとしています「FK_ChangeOrder_User_CreatedByID」テーブルの上に「ChangeOrderは」サイクルまたは複数のカスケードパスを引き起こす可能性があります。 NO DELETE NO ACTIONまたはUP UP NO NO ACTIONを指定するか、他のFOREIGN KEY制約を変更してください。
制約を作成できませんでした。以前のエラーを参照してください。私はそれに.Conventionsを持っていないようですし、Googleが唯一の古い戻っているあなたはDbContextに

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 

を追加することではなくEF7 modelBuilderでこれに対処するだろうEntity Frameworkの古いバージョンの知っている

EF4が結果をもたらすが、EF4。

具体的には、Entity Framework 7のON DELETE NO ACTIONという制約はありますか?

編集: Olegによって提供される回答は、外来キーごとに明らかになりますが、これをグローバルに宣言するためにコードの1行を使用するほうがはるかに簡単であるため、これをグローバルに行いたいと思います。何百もの人間関係のすべてが私が持つことになります。

編集2:オレグ

のコード
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; } 
} 

答えて

25

GitHutに周りに開削での作業後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); 
} 
+0

これは私の人生を救った!!!!!私はFKの問題をモデリングしていました。感謝万円!!!!!!!!!!!!!! –

10

建設

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

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

更新日:モデルに問題があることがわかりました。あなたは、すべてのプロパティにDeleteBehavior.Cascadeを設定しようと既定の移行により、

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.Restrict動作のいずれかを設定しますかのみDeleteBehavior.CascadeまたはDeleteBehavior.SetNull行動をキーを1に設定した、OnModelCreatingを変更することで動作を上書きすることができます。例えば、以下のコードはCreatedByIDDeleteBehavior.Cascadeを使用する(外部キーにON DELETE CASCADEを作成する)と他の外部キー(外部キーにはON DELETE)にDeleteBehavior.Restrict

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; } 
} 
+0

にこれを追加することですか?このようにすると、私のためにたくさんの余分なコーディングが作成され、むしろそれを避けることになります。 – Matthew

+0

@MatthewVerstraete:エラーメッセージだけで答えるのは難しいです。私はあなたが最初に多くのデータ表記法を持つクラスのセットを作成し、 'public DbSet Users {get;}のような多くのプロパティを持つ' DbContext'から派生した 'XXXContext'を作成したとします。セット; } '、' public DbSet ChangeOrders {get;セット; } '。私は 'User'、' ChangeOrder'のいくつかの定義がEF Migrationによって間違った方法で解釈されるだろうと思っていますが、正確に何ができるのか推測できません。 1つの完全な理由を見つけるためにモデルを分析する。 – Oleg

+0

あなたの問題を理解しているかどうか不明です。私はmodelBuilder.Conventions.Remove () 'のEF7バージョンを探しています;'しかし、あなたが – Matthew

関連する問題