繁体   English   中英

每次我在 ASP.NET MVC 中调用操作时都会创建数据库上下文

[英]DB Context is created every time I call an Action in ASP.NET MVC

我在创建 Web 应用程序时遇到了问题。 我的目标是每次运行我的应用程序时创建一个数据库。 这是我的做法。 我的上下文 class:

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);
        }
    }
}

初始化程序 class:

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();
        }
    }
}

然后我使用存储库 class 来操作我的 DbSet

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

和工作单元来包装我的存储库

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();
        }
    }

毕竟,我在我的业务逻辑服务中使用了工作单元,例如

    public class BandService : IBandService
    {
        readonly IUnitOfWork UnitOfWork;

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

//... Service methods

最后我在我的 Controller 中使用这些服务:

    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 不再可以访问)并且我的数据库中的任何更改都不会被反映,因为它总是被删除并重新创建。 我该怎么办? 提前致谢。

我可以看到您的 MediaPlayerInitializer.Initialize() 方法是 static,您可以创建一个 static 布尔字段并第一次将其更改为 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM