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,
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!!!
source to share
No one has answered this question yet
See similar questions:
or similar: