2017-01-19 1 views
0

を引き起こすが、データベースを更新すると、次のエラーを受け取ることがあります。Entity Frameworkのコア:どのようにFOREIGN KEY制約を導入解決するために、私は、コードファーストアプローチでEntity Frameworkのコアを使用していますサイクルまたは複数のカスケードパス

FOREIGN KEYを紹介

を'AnEventUsers'テーブルの制約 'FK_AnEventUsers_Users_UserId'は、サイクルまたは複数のカスケードパスを引き起こす可能性があります。 NO DELETE NO ACTIONまたはUP UP NO NO ACTIONを指定するか、他のFOREIGN KEY制約を変更してください。 制約またはインデックスを作成できませんでした。以前のエラーを参照してください。

私の実体は、これらは以下のとおりです。

public class AnEvent 
{ 
    public int AnEventId { get; set; } 
    public DateTime Time { get; set; } 
    public Gender Gender { get; set; } 
    public int Duration { get; set; } 
    public Category Category { get; set; } 
    public int MinParticipants { get; set; } 
    public int MaxParticipants { get; set; } 
    public string Description { get; set; } 
    public Status EventStatus { get; set; } 
    public int MinAge { get; set; } 
    public int MaxAge { get; set; } 
    public double Longitude { get; set; } 
    public double Latitude { get; set; } 

    public ICollection<AnEventUser> AnEventUsers { get; set; } 

    public int UserId { get; set; } 
    public User User { get; set; } 
} 


public class User 
{ 
    public int UserId { get; set; } 
    public int Age { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public Gender Gender { get; set; } 
    public double Rating { get; set; } 

    public ICollection<AnEventUser> AnEventUsers { get; set; } 
} 

public class AnEventUser 
{ 
    public int AnEventId { get; set; } 
    public AnEvent AnEvent { get; set; } 

    public int UserId { get; set; } 
    public User User { get; set; } 

} 

public class ApplicationDbContext:DbContext 
{ 
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options):base(options) 
    { } 


    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<AnEventUser>() 
      .HasOne(u => u.User).WithMany(u => u.AnEventUsers).IsRequired().OnDelete(DeleteBehavior.Restrict); 


     modelBuilder.Entity<AnEventUser>() 
      .HasKey(t => new { t.AnEventId, t.UserId }); 

     modelBuilder.Entity<AnEventUser>() 
      .HasOne(pt => pt.AnEvent) 
      .WithMany(p => p.AnEventUsers) 
      .HasForeignKey(pt => pt.AnEventId); 

     modelBuilder.Entity<AnEventUser>() 
      .HasOne(eu => eu.User) 
      .WithMany(e => e.AnEventUsers) 
      .HasForeignKey(eu => eu.UserId); 

    } 

    public DbSet<AnEvent> Events { get; set; } 
    public DbSet<User> Users { get; set; } 
    public DbSet<AnEventUser> AnEventUsers { get; set; } 
} 

思った問題は、我々はユーザーを削除する場合AnEventへの参照が削除され、またAnEventUserへの参照もあっいるので、削除されるということでしたAnEventからのAnEventUserへの参照でもあり、カスケーディングパスを取得します。しかし、私は、ユーザーからのAnEventUserにカスケード削除を削除します。

modelBuilder.Entity<AnEventUser>() 
     .HasOne(u => u.User).WithMany(u => u.AnEventUsers).IsRequired().OnDelete(DeleteBehavior.Restrict); 

しかし、エラーは、誰もが間違っているかを見るん、解決されませんか?ありがとう!

答えて

3

OnModelCreatingのサンプルコードでは、メソッドの開始時と終了時にmodelBuilder.Entity<AnEventUser>().HasOne(e => e.User)...を2回宣言しました。

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<AnEventUser>()  // THIS IS FIRST 
     .HasOne(u => u.User).WithMany(u => u.AnEventUsers).IsRequired().OnDelete(DeleteBehavior.Restrict); 


    modelBuilder.Entity<AnEventUser>() 
     .HasKey(t => new { t.AnEventId, t.UserId }); 

    modelBuilder.Entity<AnEventUser>() 
     .HasOne(pt => pt.AnEvent) 
     .WithMany(p => p.AnEventUsers) 
     .HasForeignKey(pt => pt.AnEventId); 

    modelBuilder.Entity<AnEventUser>()  // THIS IS SECOND. 
     .HasOne(eu => eu.User)    // THIS LINES 
     .WithMany(e => e.AnEventUsers)  // SHOULD BE 
     .HasForeignKey(eu => eu.UserId);  // REMOVED 

} 

第2コールオーバーライドが最初です。それを除く。

+0

だ私は、第二の部分を削除したが、それはまだ動作しません。 2番目の部分は、外部キーとなるものを示します。それ以外の場合、AnEventとUserの間の多対多の関係の関係はどのように定義されますか。ユーザーを削除すると、ユーザーに外部キーを持つAnEventが削除されます。 AnEventUserには、AnEventとUserの両方に対する外部キーがあります。ここでは、カスケード削除につながる問題だと思います。 Fluent APIを正しく定義する方法 – Mu2tini

+0

'OnDelete(DeleteBehavior.Restrict);の最初の部分は、この関係で正しくカスケード削除をキャンセルします。もっと何か( 'HasForreignKey')を設定したい場合は - ここに入れ、同じ' HasOne(...) 'をもう一度書かないで、最初のものを完全に取り消します。もう一度チェックし、新しいコードを投稿します(重複はしませんが、エラーは発生します)。 – Dmitry

+0

Hmmm。変更後、 'Update-Database'の前に' Remove-Migration'と 'Add-Migration'を使って移行を再作成していますか? Update-databaseは、既存の(古い)移行を適用するだけです。 – Dmitry

0

これは私がドミトリーの回答から行ったことです。

と私のために働いています。

クラス:

public class EnviornmentControls 
{ 
    public int Id { get; set; } 
    ... 

    public virtual Environment Environment { get; set; } 
} 

そして、それがマッピング

public EnviornmentControlsMap(EntityTypeBuilder<EnviornmentControls> entity) 
{ 
     entity.HasKey(m => m.Id);   

     entity.HasOne(m => m.Environment) 
      .WithMany(m => m.EnviornmentControls) 
      .HasForeignKey(m => m.EnvironmentID) 
      .OnDelete(DeleteBehavior.Restrict); // added OnDelete to avoid sercular reference 
} 
関連する問題