如何从 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>
但是表没有创建?我是否需要触发某些内容才能生成表?我做错了什么,不创建表?
此外,我正在尝试了解组织应用程序的正确方法。为每个模型都有一个单独的上下文类是否正确,或者我应该为每个模型提供一个上下文类?换句话说,上下文类应该表示表还是数据库本身?
谢谢
您可以使用包管理控制台执行如下命令:
enable-migrations
add-migration Initial
update-database
这将启用代码优先方法的迁移。然后创建数据库脚本以基于 dbcontext 设置数据库。然后根据之前创建的迁移脚本更新数据库(并运行种子(。
更详细地显示链接
是的,一旦您访问数据库,就会创建它。因此,仅打开MVC项目的起始页根本不会创建任何内容(除非您在那里放置访问数据库的内容(。
回答您的问题时,您的 CampaignContext 或任何继承 DbContext 的类都表示一个数据库。对于每个模型,您可以创建一个 DbSet,就像您对 Campaign 所做的那样,这表明每个模型都表示数据库中的一个表,但请记住,这不是一个严格的规则,具体取决于您使用的体系结构。
要使表在没有包管理器控制台的情况下生成,可以按照以下说明操作。我喜欢在开发时这样做,因为有时我喜欢强制使用新数据再次重新创建我的数据库,但这取决于每个开发人员。我喜欢使用控制台来安装包、更新它们以及在我不想删除数据库时更新它,因为您这样做的方式,如果您更改模型,您的数据库将被删除并重新创建,这意味着您将丢失那里的任何数据,尽管您的种子方法将再次运行。
此外,如果您正在开发到客户端并且无法连接到客户端的数据库(尽管在常见情况下您可以这样做(,则这很有用,那么您可以遵循 CreateDatabaseIfNotExists 方法。
你可以把它放在你的Global.asmx
或Startup.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(( 方法中放置一个断点。