不能从实体框架中删除影片
本文关键字:删除 框架 实体 不能 | 更新日期: 2023-09-27 18:09:11
我似乎有一个问题,从我的数据库中删除电影。我的目标是使用它的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");
}
下面是调用这个方法的actionlink
@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; }
}
我认为您需要在数据库中进行级联删除。
你在电影和类型之间放了一张表来定义它们之间的关系吗?您可能需要查询该表中包含要删除的FilmID的所有记录,并将这些记录与实际的Film记录一起删除。
看起来对于实体框架代码,首先你需要在DbContext上重写你的OnModelCreating方法。然后你需要调用WillCascadeOnDelete方法并将其传递为true。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Film>()
.HasOptional(e => e.FilmGenres)
.WithMany()
.WillCascadeOnDelete(true);
}
你可能会发现你需要做一个迁移来添加这个。
或者,您可以直接调用film. filmgens . 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();
}