如何从 MVC 5 ASP.NET 中的代码创建数据库

本文关键字:代码 创建 数据库 NET ASP MVC | 更新日期: 2023-09-27 18:32:35

我正在尝试学习MVC ASP.NET。对于我的基本问题,我提前道歉。

我在尝试使用模型类创建数据库时遇到问题。

这是我到目前为止所做的

我在"模型"文件夹下创建了一个模型类,如下所示

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace ScripterEngine.Models
{
    public class Campaign
    {
        public int id { get; set; }
        public string name { get; set; }
        public string layout { get; set; }
        public string call_list_connection { get; set; }
        public string call_list_table_name { get; set; }
        public string status { get; set; }
        public string intro_url { get; set; }
        public string use_transfer { get; set; }
        public string route_callback_to { get; set; }
        public string call_list_database_name { get; set; }
        public DateTime created_at { get; set; }
        public DateTime modified_at { get; set; }
        //Initilize the default value
        public Campaign()
        {
            status = "Active";
            use_transfer = "No";
            route_callback_to = "Self"; 
        }
    }
}

然后,我在我创建的一个名为"DataAccessLayer"的新文件夹中创建了一个活动上下文类,如下所示

using ScripterEngine.Models;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace ScripterEngine.DataAccessLayer
{
    public class CampaignContext : DbContext
    {
        public DbSet<Campaign> Campaign { get; set; }
        public CampaignContext() : base("con1")
        {
        }
    }
}

然后我在我创建的一个名为"播种机"的新文件夹中创建了一个启动器类,以像这样将虚拟数据添加到表中

using ScripterEngine.Models;
using ScripterEngine.DataAccessLayer;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace ScripterEngine.Seeders
{
    public class CampaignSeeder : System.Data.Entity.DropCreateDatabaseIfModelChanges<CampaignContext>
    {
        protected override void Seed(CampaignContext context)
        {
            var campaigns = new List<Campaign>
            {
                new Campaign 
                {
                    id = 1,
                    name = "Ahold Landline",
                    layout = "topmenu",
                    call_list_table_name = "foo",
                    call_list_database_name = "bar",
                },
                new Campaign 
                {
                    id = 2,
                    name = "Ahold Cellphone",
                    layout = "topmenu",
                    call_list_table_name = "foo",
                    call_list_database_name = "bar",
                }
            };
            foreach (var campaign in campaigns)
            {
                context.Campaign.Add(campaign);
            }
            context.SaveChanges();
        }
    }
}

最后,我向我的 Web.config 添加了连接字符串和一个 contaxt 块

  //I want the database table to be in the App_Data folder
  <connectionStrings>
    <add name="con1" connectionString="Data Source=(LocalDb)'v11.0;Initial Catalog=dbtest;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|'dbtest.mdf" providerName="System.Data.SqlClient"/>
  </connectionStrings>

和 Conext 块

   <contexts>
      <context type="ScripterEngine.DataAccessLayer.CampaignContext" disableDatabaseInitialization="false">
        <databaseInitializer type="ScripterEngine.Seeders.CampaignSeeder" />
      </context>
    </contexts>

但是表没有创建?我是否需要触发某些内容才能生成表?我做错了什么,不创建表?

此外,我正在尝试了解组织应用程序的正确方法。为每个模型都有一个单独的上下文类是否正确,或者我应该为每个模型提供一个上下文类?换句话说,上下文类应该表示表还是数据库本身?

谢谢

如何从 MVC 5 ASP.NET 中的代码创建数据库

您可以使用包管理控制台执行如下命令:

enable-migrations
add-migration Initial
update-database

这将启用代码优先方法的迁移。然后创建数据库脚本以基于 dbcontext 设置数据库。然后根据之前创建的迁移脚本更新数据库(并运行种子(。

更详细地显示链接

是的,一旦您访问数据库,就会创建它。因此,仅打开MVC项目的起始页根本不会创建任何内容(除非您在那里放置访问数据库的内容(。

回答您的问题时,您的 CampaignContext 或任何继承 DbContext 的类都表示一个数据库。对于每个模型,您可以创建一个 DbSet,就像您对 Campaign 所做的那样,这表明每个模型都表示数据库中的一个表,但请记住,这不是一个严格的规则,具体取决于您使用的体系结构。

要使表在没有包管理器控制台的情况下生成,可以按照以下说明操作。我喜欢在开发时这样做,因为有时我喜欢强制使用新数据再次重新创建我的数据库,但这取决于每个开发人员。我喜欢使用控制台来安装包、更新它们以及在我不想删除数据库时更新它,因为您这样做的方式,如果您更改模型,您的数据库将被删除并重新创建,这意味着您将丢失那里的任何数据,尽管您的种子方法将再次运行。

此外,如果您正在开发到客户端并且无法连接到客户端的数据库(尽管在常见情况下您可以这样做(,则这很有用,那么您可以遵循 CreateDatabaseIfNotExists 方法。

你可以把它放在你的Global.asmxStartup.cs

 protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        CampaignContext context = new CampaignContext();
        context.Database.Initialize(false);
    }

请记住,您的上下文不一定会在此处创建,这只是一个例子。如果您不想等到通过另一个页面访问数据库,则只需要这样做。

另外,由于我不喜欢将内容保留在 web.config 中,因此我更改了 CampaignContext 的构造函数:

    public CampaignContext()
        : base("con1")
    {
        Database.SetInitializer<CampaignContext>(new CampaignSeeder());
    }

因此,您可以从 web.config 中消除这种情况:

   <contexts>
      <context type="ScripterEngine.DataAccessLayer.CampaignContext" disableDatabaseInitialization="false">
        <databaseInitializer type="ScripterEngine.Seeders.CampaignSeeder" />
      </context>
    </contexts>

然后在应用的根目录中添加一个">迁移"文件夹,并添加一个名为"配置.cs"的文件:

internal sealed class Configuration : DbMigrationsConfiguration<ScripterEngine.DataAccessLayer.CampaignContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }
}

然后运行应用程序。在 Seed(( 方法中放置一个断点。