を引き起こすが、データベースを更新すると、次のエラーを受け取ることがあります。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);
しかし、エラーは、誰もが間違っているかを見るん、解決されませんか?ありがとう!
だ私は、第二の部分を削除したが、それはまだ動作しません。 2番目の部分は、外部キーとなるものを示します。それ以外の場合、AnEventとUserの間の多対多の関係の関係はどのように定義されますか。ユーザーを削除すると、ユーザーに外部キーを持つAnEventが削除されます。 AnEventUserには、AnEventとUserの両方に対する外部キーがあります。ここでは、カスケード削除につながる問題だと思います。 Fluent APIを正しく定義する方法 – Mu2tini
'OnDelete(DeleteBehavior.Restrict);の最初の部分は、この関係で正しくカスケード削除をキャンセルします。もっと何か( 'HasForreignKey')を設定したい場合は - ここに入れ、同じ' HasOne(...) 'をもう一度書かないで、最初のものを完全に取り消します。もう一度チェックし、新しいコードを投稿します(重複はしませんが、エラーは発生します)。 – Dmitry
Hmmm。変更後、 'Update-Database'の前に' Remove-Migration'と 'Add-Migration'を使って移行を再作成していますか? Update-databaseは、既存の(古い)移行を適用するだけです。 – Dmitry