1

我似乎在从我的数据库中删除电影时遇到了问题。我使用它的 FilmId 来定位电影,但是,当我尝试删除时,系统会提示我以下错误消息。

DELETE 语句与 REFERENCE 约束“FK_dbo.Genres_dbo.Films_Film_FilmId”冲突

我假设这是因为我的流派表通过 FilmId 与电影表有关系。

这是我的 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 记录一起删除。

对于实体框架代码,您首先需要覆盖 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 回答