C# Can';t从实体框架中删除胶片

C# Can';t从实体框架中删除胶片,c#,entity-framework,asp.net-mvc-4,C#,Entity Framework,Asp.net Mvc 4,我似乎在从数据库中删除电影时遇到问题。我使用电影ID来定位电影,但是,当我尝试删除时,会出现以下错误消息 DELETE语句与引用约束“FK_dbo.Genres_dbo.Films\u Film\u FilmId”冲突 我假设这是因为我的类型表通过FilmId与电影表有关系 这是我的方法 public ActionResult DeleteFilm(int id) { Film film = db.Films.Find(id); db.Films.Remove(film);

我似乎在从数据库中删除电影时遇到问题。我使用电影ID来定位电影,但是,当我尝试删除时,会出现以下错误消息

DELETE语句与引用约束“FK_dbo.Genres_dbo.Films\u Film\u FilmId”冲突

我假设这是因为我的类型表通过FilmId与电影表有关系

这是我的方法

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>();
    }
}

我认为你需要在数据库中进行级联删除。

我认为你需要在数据库中进行级联删除。

你是否在电影和流派之间有一个表,用于定义它们之间的关系?您可能需要查询该表中所有正在删除的具有FilmID的记录,并将这些记录连同实际的电影记录一起删除

看起来,对于实体框架代码,首先需要覆盖DbContext上的OnModelCreating方法。然后需要调用WillCascadeOnDelete方法并将其传递为true

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

你有没有一张桌子放在电影和流派之间,以确定它们之间的关系?您可能需要查询该表中所有正在删除的具有FilmID的记录,并将这些记录连同实际的电影记录一起删除

看起来,对于实体框架代码,首先需要覆盖DbContext上的OnModelCreating方法。然后需要调用WillCascadeOnDelete方法并将其传递为true

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

你能展示你的电影和类型吗?你能展示你的电影和类型吗?嗨,大卫,我是mvc和数据库的新手。我怎么检查呢?在电影和类型表之间有一张桌子?据我所知,他们是通过FilmId直接连接的“据我所知,他们是通过FilmId直接连接的”-但类型表中没有FilmId,是吗?你发的那堂课上没有。从逻辑上讲,电影到流派是一种多对多的关系,通常表示为一个只包含电影ID和流派ID列的联接表。“我将如何检查”-您可以使用SQL Server Management studio连接到数据库吗?我认为在VS中也有一个内置的数据库浏览器。嗨,大卫,我是mvc和数据库的新手。我怎么检查呢?在电影和类型表之间有一张桌子?据我所知,他们是通过FilmId直接连接的“据我所知,他们是通过FilmId直接连接的”-但类型表中没有FilmId,是吗?你发的那堂课上没有。从逻辑上讲,电影到流派是一种多对多的关系,通常表示为一个只包含电影ID和流派ID列的联接表。“我将如何检查”-您可以使用SQL Server Management studio连接到数据库吗?我认为VS中也有内置的数据库资源管理器。
using (var db = new FilmContext())
{
    Film film = db.Films.First(each => each.FilmTitle == "Some Title");
    film.FilmGenres.Clear();
    db.Films.Remove(film);
    db.SaveChanges();
}