Fix the way data is seeded to prevent using disposed ef contexts
This commit is contained in:
parent
2c1f1a277a
commit
f9a03e83e9
|
|
@ -20,8 +20,10 @@ namespace MusicStore.Models
|
||||||
|
|
||||||
public static async Task InitializeMusicStoreDatabaseAsync(IServiceProvider serviceProvider, bool createUsers = true)
|
public static async Task InitializeMusicStoreDatabaseAsync(IServiceProvider serviceProvider, bool createUsers = true)
|
||||||
{
|
{
|
||||||
using (var db = serviceProvider.GetService<MusicStoreContext>())
|
using (var serviceScope = serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope())
|
||||||
{
|
{
|
||||||
|
var db = serviceScope.ServiceProvider.GetService<MusicStoreContext>();
|
||||||
|
|
||||||
if (await db.Database.EnsureCreatedAsync())
|
if (await db.Database.EnsureCreatedAsync())
|
||||||
{
|
{
|
||||||
await InsertTestData(serviceProvider);
|
await InsertTestData(serviceProvider);
|
||||||
|
|
@ -50,13 +52,15 @@ namespace MusicStore.Models
|
||||||
{
|
{
|
||||||
// Query in a separate context so that we can attach existing entities as modified
|
// Query in a separate context so that we can attach existing entities as modified
|
||||||
List<TEntity> existingData;
|
List<TEntity> existingData;
|
||||||
using (var db = serviceProvider.GetService<MusicStoreContext>())
|
using (var serviceScope = serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope())
|
||||||
{
|
{
|
||||||
|
var db = serviceScope.ServiceProvider.GetService<MusicStoreContext>();
|
||||||
existingData = db.Set<TEntity>().ToList();
|
existingData = db.Set<TEntity>().ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
using (var db = serviceProvider.GetService<MusicStoreContext>())
|
using (var serviceScope = serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope())
|
||||||
{
|
{
|
||||||
|
var db = serviceScope.ServiceProvider.GetService<MusicStoreContext>();
|
||||||
foreach (var item in entities)
|
foreach (var item in entities)
|
||||||
{
|
{
|
||||||
db.Entry(item).State = existingData.Any(g => propertyToMatch(g).Equals(propertyToMatch(item)))
|
db.Entry(item).State = existingData.Any(g => propertyToMatch(g).Equals(propertyToMatch(item)))
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue