Контекст БД создается каждый раз, когда я вызываю Действие в ASP. NET MVC - PullRequest
0 голосов
/ 16 апреля 2020

Я столкнулся с проблемой при создании моего веб-приложения. Моя цель - создавать базу данных каждый раз, когда я запускаю свое приложение. Вот как я это делаю. Класс моего контекста:

namespace MyWebApplication.Data
{
    public class MediaPlayerContext : DbContext
    {
        public DbSet<TrackEntity> TrackContextEntities { get; set; }
        public DbSet<AlbumEntity> AlbumContextEntities { get; set; }
        public DbSet<ArtistEntity> ArtistContextEntities { get; set; }
        public DbSet<BandEntity> BandContextEntities { get; set; }

        public MediaPlayerContext(DbContextOptions<MediaPlayerContext> options) : base(options)
        {
            MediaPlayerInitializer.Initialize(this);
        }
    }
}

Класс инициализатора:

namespace MyWebApplication.Data
{
    public class MediaPlayerInitializer
    {
        public static void Initialize(MediaPlayerContext context)
        {
            context.Database.EnsureDeleted();
            context.Database.EnsureCreated();

            ArtistEntity DevonPortielje = new ArtistEntity()
            {
                Name = "Devon Portielje"
            };

//... at this part of code I create all my Artists, Bands, Tracks and Albums

            context.ArtistContextEntities.Add(DevonPortielje);

            context.SaveChanges();
        }
    }
}

Затем я использую класс репозитория для управления

public class Repository<TEntity> : IRepository<TEntity> where TEntity : BaseEntity
    {
        private readonly DbSet<TEntity> contextDbSet;

        public Repository(MediaPlayerContext context)
        {
            contextDbSet = context.Set<TEntity>();
        }
//... some Repository methods

моего DbSet и единицей работы, чтобы обернуть мою Репозитории

public class UnitOfWork : IUnitOfWork
    {
        private readonly MediaPlayerContext context;
        public IRepository<AlbumEntity> AlbumRepository { get; }
        public IRepository<ArtistEntity> ArtistRepository { get; }
        public IRepository<BandEntity> BandRepository { get; }
        public IRepository<TrackEntity> TrackRepository { get; }

        public UnitOfWork(MediaPlayerContext context, IRepository<AlbumEntity> albums,
            IRepository<ArtistEntity> artists, IRepository<BandEntity> bands,
            IRepository<TrackEntity> tracks)
        {
            this.context = context;
            AlbumRepository = albums;
            ArtistRepository = artists;
            BandRepository = bands;
            TrackRepository = tracks;
        }

        public void Save()
        {
            context.SaveChanges();
        }
    }

И после всего этого я использую Единицу работы в своих сервисах Business Logi c, например,

    public class BandService : IBandService
    {
        readonly IUnitOfWork UnitOfWork;

        public BandService(IUnitOfWork unitOfWork)
        {
            UnitOfWork = unitOfWork;
        }

//... Service methods

И, наконец, я использую эти Сервисы в моем контроллере:

    public class MediaPlayerController : Controller
    {
        IBandService BandService;
        IAlbumService AlbumService;
        ITrackService TrackService;

        public MediaPlayerController(IBandService bandService, IAlbumService albumService,
            ITrackService trackService)
        {
            BandService = bandService;
            AlbumService = albumService;
            TrackService = trackService;
        }

//... Controller ActionResult Methods that return Views

Я добавляю свой контекст в коллекцию служб в файле Startup.cs

public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<MediaPlayerContext>(opt =>
                opt.UseSqlServer(Configuration.GetConnectionString("MediaPlayerDatabase")));

//...

Проблема в том, что каждый раз, когда открывается новый вид, создается новая база данных из-за этих строк в моем Метод Initialize.

            context.Database.EnsureDeleted();
            context.Database.EnsureCreated();

Но я не могу найти какой-либо другой возможный способ создания моей базы данных (SetInitializer больше не доступен), и никакие изменения в моей базе данных никогда не будут отражены, поскольку она всегда удаляется и создается заново. , Что я делаю? Заранее спасибо.

1 Ответ

1 голос
/ 16 апреля 2020

Я вижу, что ваш метод MediaPlayerInitializer.Initialize () имеет значение stati c, вы можете создать поле stati c bool, изменить его в первый раз на true и проверить его значение. Как то так:

private static bool initialized = false; // I know false is not needed

public static void Initialize(MediaPlayerContext context)
{
    if (initialized) {
        return;
    }

    context.Database.EnsureDeleted();
    context.Database.EnsureCreated();

    ArtistEntity DevonPortielje = new ArtistEntity()
    {
        Name = "Devon Portielje"
    };

    //... at this part of code I create all my Artists, Bands, Tracks and Albums
    context.ArtistContextEntities.Add(DevonPortielje);

    context.SaveChanges();

    initialized = true;
}
...