MVC 4 を立ち上げたばかりですが、アプリケーションでエラーが発生したため、修正に支援が必要です。
Author & Book テーブルがあります。Author テーブルは親であり、各著者に複数の本を関連付けることができます。
まだブックが割り当てられている著者を削除しようとするまで、すべてがうまく機能しています。その場合、SaveChanges() で次のようなエラーが表示されます。
DELETE ステートメントは、REFERENCE 制約 "FK_Book_Author" と競合しました。
エラーは完全に理にかなっていますが、単純に爆発するのではなく、アプリケーションがユーザーに適切なエラー メッセージを表示することを望みます。
子が関連付けられているレコードを削除したときにアプリケーションが爆発しないように、モデルでこの関係を定義するにはどうすればよいですか?
著者クラス
public partial class Author
{
public Author()
{
this.Book = new HashSet<Book>();
}
[Key]
public int AuthorId { get; set; }
[Required]
public string AuthorName { get; set; }
public virtual Book Book { get; set; }
}
ブッククラス
public partial class Book
{
[Key]
public int BookId { get; set; }
[Required]
public string BookName { get; set; }
[Required]
[ForeignKey("Author")]
public string AuthorId { get; set; }
}
モデル
最近、OnModelCreating をオーバーライドしようと試み始めましたが、効果がないようです。
public partial class BookEntities : DbContext
{
public BookEntities()
: base("name=BookEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Book>().HasRequired(p => p.Author)
.WithMany(b => b.Books)
.HasForeignKey(p => p.AuthorId);
modelBuilder.Entity<Author>()
.HasMany(p => p.Books)
.WithRequired(b => b.Author)
.WillCascadeOnDelete(false);
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}
public DbSet<Book> Books { get; set; }
public DbSet<Author> Authors { get; set; }
}
部分的な更新
- これは、0..1 対多の関係に関する問題です。
- 私は.edmxを使用しています。これにより、OnModelCreating メソッドが完全に無効になることがわかりました。
- これがクラッシュするのをブロックするために、Linq ステートメントを DeleteConfirmed メソッドにスローできるようですが、私はそのアプローチが本当に好きではありません。