Postgresql (npgsql 2.2.5) with entity framework 6 and first code

I am having problems directly initializing the database using code. I am mostly having trouble getting my initializer to run if my database doesn't exist.

I have tried the following,

Stackoverflow question

but my problem is that I have to call this method on my start page for it to start the create database. Even so, the tables won't be created unless I do it manually. It will be a problem if I am going to integrate this with an application that already uses sql server and already has about 50 tables in dbcontext.

Anyway, here's my code:

DbContext

public class TestMigrationsDatabase : DbContext
    {
        public TestMigrationsDatabase()
            : base(nameOrConnectionString: "TestMigrations.Domain.Entities.TestMigrationsDatabase")
        {
            //Database.SetInitializer<TestMigrationsDatabase>(null);
            Database.SetInitializer<TestMigrationsDatabase>(new TestMigrations.Domain.TestMigrationsInitializer());
        }
        public DbSet<Base> Bases { get; set; }
        public DbSet<Fighter> Fighters { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.HasDefaultSchema("public"); // postgresql specific
            base.OnModelCreating(modelBuilder);
        }
        public override int SaveChanges()
        {
            return base.SaveChanges();
        }
    }

      

Initializer:

public class TestMigrationsInitializer : CreateDatabaseIfNotExists<TestMigrationsDatabase>
    {
        protected override void Seed(TestMigrationsDatabase context)
        {

            this.CreateDatabase(ConfigurationManager.ConnectionStrings["TestMigrations.Domain.Entities.TestMigrationsDatabase"].ToString());

            base.Seed(context);

            LoadTestTables(context);
        }


        private void LoadTestTables(TestMigrationsDatabase context){
            Base base = new Base();
            base.Name = "Test 1 Base";

            context.Bases.Add(base);

            context.SaveChanges();
        }

        public void CreateDatabase(string connectionString)
        {
            var builder = new NpgsqlConnectionStringBuilder(connectionString);
            var databaseName = "TestMigrations"; // REMEMBER ORIGINAL DB NAME
            builder.Database = "postgres"; // TEMPORARILY USE POSTGRES DATABASE

            // Create connection to database server
            using (var connection = new NpgsqlConnection(builder.ConnectionString))
            {
                connection.Open();

                // Create database
                var createCommand = connection.CreateCommand();
                createCommand.CommandText = string.Format(@"CREATE DATABASE ""{0}"" ENCODING = 'UTF8'", databaseName);
                createCommand.ExecuteNonQuery();

                connection.Close();
            }
        }
    }

      

controller

public class HomeController : Controller
    {
        public TestMigrationsDatabase _context = new TestMigrationsDatabase();

        //
        // GET: /Home/

        public ActionResult Index()
        {
            TestMigrations.Domain.TestMigrationsInitializer initializer = new Domain.TestMigrationsInitializer();
            initializer.CreateDatabase(ConfigurationManager.ConnectionStrings["TestMigrations.Domain.Entities.TestMigrationsDatabase"].ToString());
     return View();
}
}

      

So with all this, my questions are: 1. Have this initializer been put on the first controller to fix it correctly? Or do I just need to create a context for the constructor to initiate initialization? 2. How to properly create tables after creating a database?

Thank!!!

+3


source to share





All Articles