连接 Entity Framework 中的 3 个表

Connection with 3 tables in Entity Framework

我在 SQL 数据库中有 3 个 table:MoviesViewerMovies_Viewer(=显示哪个观众看过哪部电影) .

客户端将插入 Viewer 名称和 Movie 名称以及 Entity Framework,我想将其插入到我拥有的 3 table 中(使用 linq例如),但我怎么知道什么 ID 获取电影和观众将其插入第三个 table?

我应该插入到 2 个 table 中,然后调用另一个函数将 ID 插入到第三个中吗?我如何获得所有数据?

这是我的代码 - 这样做有错吗?

[WebMethod]
public void InsertToDB(string viewerName, string movieName)
{
    InsertToViewerTbl(viewerName);
    InsertToMoviesTbl(movieName);
}

private void InsertToMoviesTbl(string movieName)
{
    var db = new MoviesEntities1();
    var movieNameTbl = new MovieNameTbl();
    movieNameTbl.MovieName = movieName;

    db.AddToMovieNameTbls(movieNameTbl);
    db.SaveChanges();
}

private void InsertToViewerTbl(string viewerName)
{
    var db = new MoviesEntities1();
    var viewerNameTbl = new ViewerNamesTbl();
    viewerNameTbl.ViewerName = viewerName;

    db.AddToViewerNamesTbls(viewerNameTbl);
    db.SaveChanges();
}

您应该尝试使用 Entity Framework 的内置 "navigation properties" 一步 完成此操作 。假设您的 Movie class 有一个 Viewers 导航 属性,您应该这样做:

private void InsertToMovies(string movieName, string viewerName)
{
    using (var db = new MoviesEntities1())
    {
         // create the new movie, set its name
         var newMovie = new MovieNameTbl();
         newMovie.MovieName = movieName;

         // create the new viewer, set its name
         var viewer = new ViewerNamesTbl();
         viewer.ViewerName = viewerName;

         // add the viewer to the new movie instance
         newMovie.Viewers.Add(viewer);

         // add movie to the database context and save it   
         db.AddToMovieNameTbls(movieNameTbl);
         db.SaveChanges();
    }
}

有了这个,Entity Framework 将完成所有繁重的工作 - 你不需要知道任何 ID,你不需要做任何第二次插入,你不需要处理 "link" table - 所有这些都由 Entity Framework 为您处理。

您可以 return 对象,将它们添加到数据库后,例如:

[WebMethod] public void InsertToDB(string viewerName, string movieName) 
{
    var viewer = InsertToViewerTbl(viewerName); 
    var movie = InsertToMoviesTbl(movieName);
    InsertToMovies_Viewer(viewer, movie);
}

private MovieNameTbl InsertToMoviesTbl(string movieName)
{
    var db = new MoviesEntities1();

    var movieNameTbl = new MovieNameTbl();
    movieNameTbl.MovieName = movieName;

    db.AddToMovieNameTbls(movieNameTbl);
    db.SaveChanges();

    return movieNameTbl ;
}

private ViewerNamesTbl InsertToViewerTbl(string viewerName)
{
    var db = new MoviesEntities1();

    var viewerNameTbl = new ViewerNamesTbl();
    viewerNameTbl.ViewerName = viewerName;

    db.AddToViewerNamesTbls(viewerNameTbl);
    db.SaveChanges();

    return viewerNameTbl;
}

private void InsertToMovies_Viewer(ViewerNamesTbl viewer, MovieNameTbl movie)
{
    var db = new MoviesEntities1();

    var movieViewer = new Movies_Viewer();// or however the table is called
    movieViewer.Viewer = viewer; // or however the column is called
    movieViewer.Movie= movie; // or however the column is called

    db.AddToMovies_Viewer(movieViewer);
    db.SaveChanges();
}

但是我建议你用一种方法来做,这样你就不会每次都创建连接,每次都保存更改:

[WebMethod] public void InsertToDB(string viewerName, string movieName) 
{
    var db = new MoviesEntities1();

    var movie = new MovieNameTbl();
    movieNameTbl.MovieName = movieName;

    db.AddToMovieNameTbls(movieNameTbl);

    var viewer = new ViewerNamesTbl();
    viewerNameTbl.ViewerName = viewerName;

    db.AddToViewerNamesTbls(viewerNameTbl);

    var movieViewer = new Movies_Viewer();// or however the table is called
    movieViewer.Viewer = viewer; // or however the column is called
    movieViewer.Movie= movie; // or however the column is called

    db.AddToMovies_Viewer(movieViewer);
    db.SaveChanges();
}