![](/img/trans.png)
[英]How do I use EF to automatically create a database and repository in ASP.NET MVC?
[英]How do I create the database from the code in ASP.NET MVC 5?
我正在嘗試學習ASP.NET MVC。 對於我的基本問題,我事先表示歉意。
我在嘗試通過使用模型類創建數據庫時遇到問題。
這是我到目前為止所做的
我在“模型”文件夾下創建了一個模型類,如下所示
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”的文件夾中創建了Campaign上下文類,如下所示
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")
{
}
}
}
然后,我在新創建的名為“ Seeders”的文件夾中創建了一個初始化類,以將虛擬數據添加到表中,如下所示
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>
然后在您應用的根目錄中添加一個Migrations文件夾,並添加一個名為Configuration.cs的文件:
internal sealed class Configuration : DbMigrationsConfiguration<ScripterEngine.DataAccessLayer.CampaignContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
}
}
然后運行您的應用程序。 在Seed()方法中放置一個斷點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.