【问题标题】:Deleting a movie with many to many relations删除具有多对多关系的电影
【发布时间】:2013-12-03 14:47:23
【问题描述】:

我有这个 SQL 数据库设置:

我现在有一部电影有 2 个类型和 2 个演员。我想删除这部电影,但不可能:

movie = (Movie)listBoxMovieExistingMovies.SelectedItem;
db.Movies.Remove(movie);
db.SaveChanges();
LoadMovieExistingMovies();

我知道我必须先删除关系,但我不知道该怎么做。

编辑:

(我如何创建 MovieActor 和 MovieGenres)

CREATE TABLE MovieGenre
(
MovieID int NOT NULL REFERENCES Movie(MovieID),
GenreID int NOT NULL REFERENCES Genre(GenreID),
PRIMARY KEY(MovieID,GenreID)

)

【问题讨论】:

  • 你遇到了什么错误?
  • @webdad3,图中显示了外键。
  • 该代码是否抛出异常?
  • MovieGenres 和 MovieActors 都包含两个外键,它们在其中自行组合成一个主键 CREATE TABLE MovieGenre ( MovieID int NOT NULL REFERENCES Movie(MovieID), GenreID int NOT NULL REFERENCES Genre(GenreID), PRIMARY KEY(MovieID,GenreID) )
  • 查看内部异常了解详情。

标签: c# sql winforms entity-framework visual-studio-2013


【解决方案1】:

您需要先从上下文中选择电影吗?

movie = db.Movies.FirstOrDefault(m => m.MovieId == ((Movie)listBoxMovieExistingMovies.SelectedItem).MovieId);
db.Movies.Remove(movie);
db.SaveChanges();
LoadMovieExistingMovies();

【讨论】:

    【解决方案2】:

    尝试对数据库进行级联删除

    CREATE TABLE [dbo].[MovieActor](
        [MovieId] [int] NOT NULL,
        [ActorId] [int] NOT NULL
    ) ON [PRIMARY]
    
    GO
    
    ALTER TABLE [dbo].[MovieActor]  WITH CHECK ADD  CONSTRAINT [FK_MovieActor_Actor] FOREIGN KEY([ActorId])
    REFERENCES [dbo].[Actor] ([Id]) ON DELETE CASCADE
    GO
    
    ALTER TABLE [dbo].[MovieActor] CHECK CONSTRAINT [FK_MovieActor_Actor]
    GO
    
    ALTER TABLE [dbo].[MovieActor]  WITH CHECK ADD  CONSTRAINT [FK_MovieActor_Movie] FOREIGN KEY([MovieId])
    REFERENCES [dbo].[Movie] ([Id]) ON DELETE CASCADE
    GO
    
    ALTER TABLE [dbo].[MovieActor] CHECK CONSTRAINT [FK_MovieActor_Movie]
    GO
    

    如果您采用此解决方案,请花时间阅读有关级联的信息。

    【讨论】:

    • 对不起,我对编程很陌生,你给我的没有意义:/
    • 在删除之前,您必须确保要删除的实体存在于数据库中,并且知道用于删除的对象(即 DbContext)。有两种方法:按照 Troy 的建议查询数据库,或者将本地实体附加到上下文中,如上面的代码所示。
    • 异常:抛出:“DELETE 语句与 REFERENCE 约束“FK__MovieActo__Movie__1920BF5C”冲突。冲突发生在数据库“MovieCollection”、表“dbo.MovieActor”、列“MovieID”中。该语句已终止。” (System.Data.SqlClient.SqlException) 抛出 System.Data.SqlClient.SqlException:“DELETE 语句与 REFERENCE 约束“FK__MovieActo__Movie__1920BF5C”冲突。冲突发生在数据库“MovieCollection”、表“dbo.MovieActor”、列'MovieID'。声明已终止。”时间:2013-12-03 16:17:27
    【解决方案3】:

    我找到了两种方法

    1:

    movie = (Movie)listBoxMovieExistingMovies.SelectedItem;
                var queryMovie = db.Movies.Include("Genres").Include("Actors").First(m => m.MovieID==movie.MovieID);
    db.Movies.Remove(queryMovie);
    

    2:

        movie = (Movie)listBoxMovieExistingMovies.SelectedItem;
        movie.Actors.Clear();
        movie.Genres.Clear();
        db.Movies.Remove(movie);
        db.SaveChanges();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多