2013-04-14 64 views
1

删除电影我似乎有从我的数据库中删除一个电影的问题。我使用FilmId来定位电影,但是,当我尝试删除时,系统提示出现以下错误消息。无法从实体框架

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

我假设这是因为我的风格表格必须Film表的关系,通过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 }); 
} 

我怎么会删除为了让我删除影片中的关系ActionLink的。任何帮助将不胜感激。

这里是我的电影类

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; } 
} 
+0

你可以显示你的电影和风格类型? – devdigital

回答

1

,你需要有级联在数据库中删除我guees。

0

你有一个表中的电影和流派,定义他们之间的关系坐?您可能需要使用您正在删除的FilmID查询该表中的所有记录,并将这些记录与实际的电影记录一起删除。

看起来像实体框架代码首先,你需要覆盖在你的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(); 
} 
+0

嗨大卫,我是mvc和数据库的新手。我将如何检查电影和流派桌之间是否有桌子?据我所知,他们是直接通过FilmId – gb1986

+0

连接“据我所知,他们是直接通过FilmId连接” - 但有没有FilmId在类型表呢?你已经发布的课程中没有。和逻辑胶片到类别为许多一对多的关系,您通常代表与公正电影ID和类型ID列连接表。 “我将如何检查” - 您可以使用SQL Server Management Studio连接到数据库吗?我认为VS中也有一个内置的数据库浏览器。 – Rup