[英]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.