1

データベースからフィルムを削除する際に問題が発生しているようです。FilmId を使用して映画をターゲットにしていますが、削除しようとすると、次のエラー メッセージが表示されます。

DELETE ステートメントが REFERENCE 制約 "FK_dbo.Genres_dbo.Films_Film_FilmId" と競合しました

これは、私の Genre テーブルが FilmId を介して Film テーブルと関係を持っているためだと思います。

これが私のDeleteFilmメソッドです

public ActionResult DeleteFilm(int id)
{
    Film film = db.Films.Find(id);
    db.Films.Remove(film);
    db.SaveChanges();
    return RedirectToAction("MyFilms");
}

このメソッドを呼び出すアクションリンクは次のとおりです

@using (Html.BeginForm())
{
    @Html.ActionLink("Remove Movie", "DeleteFilm", new { id = Model.FilmId });
}

映画を削除するにはどうすれば関係を削除できますか. どんな助けでも大歓迎です。

これが私の映画クラスです

public class Film
{
    [Key]
    public int FilmId { get; set; }
    public string FilmTitle { get; set; }
    public int FilmReleaseYear { get; set; }
    public string FilmDirector { get; set; }
    public string FilmRating { get; set; }
    public string FilmImageUrl { get; set; }
    public string FilmImdbUrl { get; set; }
    public virtual ICollection<Genre> FilmGenres { get; set; }
    public virtual ICollection<FilmCastMember> FilmCastList { get; set; }
    public virtual ICollection<FilmReview> FilmReviews { get; set; }

    public Film()
    {
        FilmGenres = new List<Genre>();
        FilmCastList = new List<FilmCastMember>();
        FilmReviews = new List<FilmReview>();
    }
}

ここに私のジャンルタイプがあります

public class Genre
{   
    [Key]
    public int GenreId { get; set; }
    public string GenreType { get; set; }
}
4

2 に答える 2

1

データベースでカスケード削除が必要だと思います。

于 2013-04-14T15:21:20.433 に答える
0

映画とジャンルの関係を定義するテーブルはありますか? おそらく、削除する FilmID を持つすべてのレコードについてそのテーブルをクエリし、実際の Film レコードと共にそれらのレコードを削除する必要があります。

Entity Framework コードの場合、最初に DbContext で OnModelCreating メソッドをオーバーライドする必要があるようです。次に、WillCascadeOnDelete メソッドを呼び出して true を渡す必要があります。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Film>()
        .HasOptional(e => e.FilmGenres)
        .WithMany()
        .WillCascadeOnDelete(true);
}

これを追加するには、移行を行う必要があることに気付くでしょう。

または、単に film.FilmGenres.Clear() を呼び出してコレクションからジャンルを削除することもできますが、しばらくすると面倒になります。

using (var db = new FilmContext())
{
    Film film = db.Films.First(each => each.FilmTitle == "Some Title");
    film.FilmGenres.Clear();
    db.Films.Remove(film);
    db.SaveChanges();
}
于 2013-04-14T15:21:54.957 に答える