DB_Context с несколькими таблицами в ASP.NET Сердечник

#asp.net #asp.net-mvc #asp.net-core

Вопрос:

Я создал API с использованием .NET CORE, и у меня есть миграции для создания таблицы фильмов в базе данных MySQL, Проблема, с которой я сейчас сталкиваюсь, заключается в том, что у меня есть несколько таблиц для каждого пользователя с одинаковой схемой таблицы, созданной при миграции, мне нужна помощь в том, как использовать контекст бд, но изменить таблицу, из которой данные получены в API. Имя таблицы-это переменная.

Модель Фильмов:

 using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace BingeHUB_API.Models
{
    public class Movies
    {
        [Key]
        public int TMDB_ID { get; set; }

        [Required]
        [MaxLength(70)]
        public string MovieTitle { get; set; }
        [Required]
        public string MovieOverview { get; set; }
        [Required]
        [MaxLength(10)]
        public string MovieOriginalLanguage { get; set; }

        [Required]
        public DateTime MovieReleaseDate { get; set; }

        [Required]
        [MaxLength(5)]
        public float MoviePopularity { get; set; }

        [Required]
        [MaxLength(5)]
        public float MovieAverageVote { get; set; }

        [Required]
        public bool MovieForU18 { get; set; }

        [Required]
        public string MovieImage { get; set; }

        [Required]
        public string MovieGenres { get; set; }

        [Required]
        public string MovieDownloadLink1 { get; set; }

        [Required]
        public string MovieDownloadLink2 { get; set; }

        [Required]
        public string MovieDownloadLink3 { get; set; }

        [Required]
        [MaxLength(20)]
        public string MovieStatus { get; set; }
    }
}
 

Миграция Фильмов

 using System;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;

namespace BingeHUB_API.Migrations
{
    public partial class moviesDbMigration : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "movie",
                columns: table => new
                {
                    TMDB_ID = table.Column<int>(type: "int", nullable: false)
                        .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
                    MovieTitle = table.Column<string>(type: "varchar(70) CHARACTER SET utf8mb4", maxLength: 70, nullable: false),
                    MovieOverview = table.Column<string>(type: "longtext CHARACTER SET utf8mb4", nullable: false),
                    MovieOriginalLanguage = table.Column<string>(type: "varchar(10) CHARACTER SET utf8mb4", maxLength: 10, nullable: false),
                    MovieReleaseDate = table.Column<DateTime>(type: "datetime(6)", nullable: false),
                    MoviePopularity = table.Column<float>(type: "float", maxLength: 5, nullable: false),
                    MovieAverageVote = table.Column<float>(type: "float", maxLength: 5, nullable: false),
                    MovieForU18 = table.Column<bool>(type: "tinyint(1)", nullable: false),
                    MovieImage = table.Column<string>(type: "longtext CHARACTER SET utf8mb4", nullable: false),
                    MovieGenres = table.Column<string>(type: "longtext CHARACTER SET utf8mb4", nullable: false),
                    MovieDownloadLink1 = table.Column<string>(type: "longtext CHARACTER SET utf8mb4", nullable: false),
                    MovieDownloadLink2 = table.Column<string>(type: "longtext CHARACTER SET utf8mb4", nullable: false),
                    MovieDownloadLink3 = table.Column<string>(type: "longtext CHARACTER SET utf8mb4", nullable: false),
                    MovieStatus = table.Column<string>(type: "varchar(20) CHARACTER SET utf8mb4", maxLength: 20, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_movie", x => x.TMDB_ID);
                });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "movie");
        }
    }
}
 

The Db Context:

 using BingeHUB_API.Models;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace BingeHUB_API.Data
{
    public class BingeHUBApiContext: DbContext
    {
        public BingeHUBApiContext(DbContextOptions<BingeHUBApiContext> opt) : base(opt)
        {

        }
        public DbSet<Movies> movie { get; set; }
    }
}
 

Репозиторий Sql:

 using BingeHUB_API.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json.Linq;
using BingeHUB_API.DTOs;
using RestSharp;
using Newtonsoft.Json;

namespace BingeHUB_API.Data
{
    public class SQLCommanderRepo : ICommanderRepo
    {
        private readonly BingeHUBApiContext _context;
        private IConfiguration configuration;

        public SQLCommanderRepo(BingeHUBApiContext context, IConfiguration iconfig)
        {
            _context = context;
            configuration = iconfig;
        }

        void ICommanderRepo.addDownloadLink(Movies mv, string link)
        {
            //nothing
        }

        void ICommanderRepo.addMovie(Movies mv)
        {
            if (mv == null)
            {
                throw new ArgumentNullException(nameof(mv));
            }

            _context.movie.Add(mv);
        }

        void ICommanderRepo.deleteMovies(Movies mv)
        {
            if (mv == null)
            {
                throw new ArgumentNullException(nameof(mv));
            }

            _context.movie.Remove(mv);
        }

        IEnumerable<Movies> ICommanderRepo.GetAllMovies()
        {
            //the skip value is appended everytime the next button is clicked on a page and this shows the movies on the page;

            var movies = _context.movie.ToList();

            if (movies != null)
            {
                return movies;
            }

            return null;
        }

        IEnumerable<Movies> ICommanderRepo.GetMovieByTitle(string title)
        {
            var movies = _context.movie.Where(p => p.MovieTitle.Contains(title)).ToList();

            if (movies != null)
            {
                return movies;
            }

            return null;

        }

        Movies ICommanderRepo.GetMovieByID(int id)
        {
            var movies = _context.movie.FirstOrDefault(p => p.TMDB_ID == id);

            if (movies != null)
            {
                return movies;
            }

            return null;

        }

        bool ICommanderRepo.savechanges()
        {
            return (_context.SaveChanges() >= 0);
        }

        async Task<moviesCreateDTO> ICommanderRepo.GetByIdAsync(int id)
        {
            moviesCreateDTO TempMovie = new moviesCreateDTO();

            string kEy = configuration.GetValue<string>("TMDbKey:key");

            string Link = "https://api.themoviedb.org/3/movie/" id "?api_key=" kEy "amp;language=en-US";
                        
            RestClient client = new RestClient(Link);
            RestRequest request = new RestRequest(Method.GET);
            IRestResponse restResponse = await client.ExecuteAsync(request);

            if (restResponse.IsSuccessful)
            {
                var content = JsonConvert.DeserializeObject<JToken>(restResponse.Content);

                var tempID = content["id"].Value<int>();
                var tempMovieTitle = content["original_title"].Value<string>();
                var tempMovieOverview = content["overview"].Value<string>();
                var tempMovieOriginalLanguage = content["original_language"].Value<string>();
                var tempMovieReleaseDate = content["release_date"].Value<DateTime>();
                var tempMoviePopularity = content["popularity"].Value<float>();
                var tempMovieAverageVote = content["vote_average"].Value<float>();
                var tempU18Decision = content["adult"].Value<string>();
                var tempMovieForU18 = false;
                var tempMovieStatus = content["status"].Value<string>();
                var tempMovieGenres = "";
                var Movieposterpath = content["poster_path"].Value<string>();
                var tempMovieImage = "https://image.tmdb.org/t/p/original"   Movieposterpath;
                var tempDL = "TBA";


                if (tempU18Decision == "false")
                {
                    tempMovieForU18 = true;
                }

                var articles = content["genres"].Children();

                // this part gets the Id's from the json response and then concatonates them to a string genre
                foreach (var article in articles)
                {
                    tempMovieGenres = tempMovieGenres   article["name"].Value<string>()   ", ";
                }

                //this section is to get data from the json response and then save it to a new moviesCreateDTO;

                TempMovie = new moviesCreateDTO()
                {
                    TMDB_ID = tempID,
                    MovieTitle = tempMovieTitle,
                    MovieOverview = tempMovieOverview,
                    MovieOriginalLanguage = tempMovieOriginalLanguage,
                    MovieReleaseDate = tempMovieReleaseDate,
                    MoviePopularity = tempMoviePopularity,
                    MovieAverageVote = tempMovieAverageVote,
                    MovieForU18 = tempMovieForU18,
                    MovieImage = tempMovieImage,
                    MovieGenres = tempMovieGenres,
                    MovieDownloadLink1 = tempDL,
                    MovieDownloadLink2 = tempDL,
                    MovieDownloadLink3 = tempDL,
                    MovieStatus = tempMovieStatus,
                };
                                
                return TempMovie;
            }
            else
            {
                return null;
            }
        }
    }
}
 

Комментарии:

1. EF Core предоставляет два основных способа синхронизации модели EF Core и схемы базы данных. Чтобы выбрать между ними, решите, является ли ваша базовая модель EF или схема базы данных источником истины. Если вы хотите, чтобы ваша базовая модель EF была источником истины, используйте миграции. По мере внесения изменений в базовую модель EF этот подход постепенно применяет соответствующие изменения схемы к вашей базе данных, чтобы она оставалась совместимой с вашей базовой моделью EF. Более подробную информацию см. в разделе Управление схемами баз данных.

2. @ZhiLv Хорошо, но если я использую базу данных для создания схемы, означает ли это, что я могу получить модель для всех отдельных таблиц в базе данных или проще просто использовать подход SQL и запросов для редактирования базы данных.

3. Я новичок в .NET, поэтому многого в нем не понимаю.

4. Вы можете ознакомиться с учебником по Entity Framework . EF (ядро) обеспечивает два подхода: Сначала код и Сначала база данных. Рабочий процесс разработки в первом подходе к коду будет следующим: Создайте или измените классы домена- > настройте эти классы домена с помощью Fluent-API или атрибутов аннотации данных- > > Создайте или обновите схему базы данных с помощью автоматической миграции или миграции на основе кода. В подходе, основанном на базе данных, вы сначала создадите базу данных, а затем на основе таблиц данных сгенерируете классы связей.

5. «но если я использую базу данных для создания схемы, означает ли это, что я могу получить модель для всех отдельных таблиц в базе данных» Да, если вы используете подход, основанный на базе данных, он создаст базу моделей на таблицах в базе данных. EF позволяет разработчикам работать с данными, используя объекты классов, специфичных для домена, не фокусируясь на базовых таблицах и столбцах базы данных. С помощью Entity Framework разработчики могут работать на более высоком уровне абстракции, когда они имеют дело с данными, и могут создавать и поддерживать приложения, ориентированные на данные, с меньшим количеством кода по сравнению с традиционными приложениями.