postgresql(npgsql 2.2.5),实体框架6,代码优先

时间:2015-06-13 04:50:13

标签: postgresql ef-code-first entity-framework-6 npgsql

我现在遇到问题,首先使用代码初始化数据库。如果我的数据库不存在,我基本上遇到了如何触发初始化程序的问题。

我尝试了以下内容,

https://stackoverflow.com/a/28960111/639713

但我的问题是我必须在我的初始页面上调用此方法才能触发create database。即使这样,除非我手动执行,否则不会创建表。如果我要将它与已经使用sql server并且已经在dbcontext上有大约50个表的应用程序集成,那么这将是一个问题。

无论如何,这是我的代码:

的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();
        }
    }

初​​始化器:

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();
            }
        }
    }

控制器

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();
}
}

所有这一切,我的问题是: 1.将初始化程序放在第一个控制器上以触发它是否正确?或者我应该只是实例化上下文,以便构造函数将触发初始化程序? 2.如何在创建数据库后正确创建表?

感谢!!!

0 个答案:

没有答案