seed in memory database ef core code example

Example 1: how to seed data in EF

// This method of seeding is creating another Project alongside your webApi
* Seed File [0/7]
  - [ ] Create Seed Project 
       - mkdir Seeder; cd Seeder; dotnet new console;
  - [ ] Manage Dependencies
       - Create Contexts
       - Add in references to your DbContexts in your Seeder.csproj like

		<ItemGroup>
          <ProjectReference Include="..\path\name.csproj" />
        </ItemGroup>
        
     - Add needed EF packages with dotnet add package <package>
    
  - [ ] Create Seeder Class for <ClassNameToBeSeeded>
       - mkdir Models/
       - nano Models/classNameSeeder.cs

         (or use your ide to manage files)

  - [ ] Add data to be seeded in static methods
      
      //Class or Object to be seeded
      private static IList<ClassNameToBeSeeded> SeedData()
        {
            IList<ClassNameToBeSeeded> pages = new List<ClassNameToBeSeeded>();

            // Creating objects here to pass into the context
    
            pages.Add(new ClassNameToBeSeeded
               {
                // These have to match the unmapped variables in your context
                variable = "something",
               }
            );

            return pages;
        }

  - [ ] Add in call to persist objects through context
  
       public static void SeedToDB()
        {
            var contextOptions = new DbContextOptionsBuilder<ContextName>()
                .UseSqlServer("ConnectionString")
                .Options;

            var context = new ContextName(contextOptions);
            context.Database.EnsureCreated();
            var sections = classNameSeeder.SeedData();
            context.<contextDbSet>.AddRange(sections);
            context.SaveChanges();
        }

  - [ ] Call this in main
  
    namespace Seeder
    {
        class Program
        {
            public static void Main(string[] args)
            {
                //Its static so no need to instantiate
                classNameSeeder.SeedToDB();
            }
        }
    }

   - [ ] Make sure your tables are created with migrations and run the program via
         dotnet run
         
   
 
//Useful methods for database manipulation
  
// reset migration for table
dotnet ef database update 0 --context <context>

//run migration for table creation
dotnet ef database update --context <context>

Example 2: database hasData method C#

// it goes into class ApplicationDbContext : DbContext
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Author>().HasData(
        new Author
        {
            AuthorId = 1,
            FirstName = "William",
            LastName = "Shakespeare"
        }
    );
    modelBuilder.Entity<Book>().HasData(
        new Book { BookId = 1, AuthorId = 1, Title = "Hamlet" },
        new Book { BookId = 2, AuthorId = 1, Title = "King Lear" },
        new Book { BookId = 3, AuthorId = 1, Title = "Othello" }
    );

   /*further relational instructions may come here, like:
        modelBuilder.Entity<Author>()
        .HasMany<Book>(a => a.Books)
        .WithOne(b => b.Author)
        .HasForeignKey(b => b.AuthorId);
}

Tags:

Misc Example