通過EF Code First創建新的數據庫,默認的都是: 命名空間.Models.MovieDbContext之類的數據庫文件,如果想用自定義的數據庫名稱,則可以用下面的方法:
1.1、首先必須建立好Model文件
Models中Movie.cs
1 using System; 2 using System.ComponentModel.DataAnnotations; 3 using System.Data.Entity; 4 5 namespace MVCLX.Models 6 { 7 public class Movie 8 { 9 public int Id{get;set;} 10 [StringLength(60,MinimumLength=3)] 11 [Display(Name="電影標題")] 12 public string Title{get;set;} 13 [Display(Name="分類")] 14 [StringLength(30)] 15 [Required] 16 public string Genre{get;set;} 17 [Display(Name="發布日期")] 18 [DataType(DataType.Date)] 19 [DisplayFormat(DataFormatString="{0:yyyy-MM-dd}",ApplyFormatInEditMode=true)] 20 public DateTime ReleaseDate {get;set;} 21 [Display(Name="價格")] 22 [DataType(DataType.Currency)] 23 [Range(1,1000)] 24 public decimal Price { get; set; } 25 [StringLength(5)] 26 public string Rating { get; set; } 27 } 28 public class MovieDbContext : DbContext 29 {
//方法一:這種用法一般用在沒有數據庫或數據庫模型有大的改動,需要刪除舊的,按新模型重建時可以使用。
// 一旦數據庫初始化成功,就可以注釋該段語句,或使用Database.SetInitializer<MovieDbContext>(null);
30 //static MovieDbContext()
31 //{
32 //Database.SetInitializer(new CreateDatabaseIfNotExists<MovieDbContext>());
//Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MovieDbContext>());
//Database.SetInitializer(new DropCreateDatabaseAlways<MovieDbContext>());
//Database.SetInitializer<MovieDbContext>(null);
33 //}
//方法二:
//推薦第二種方法,因為默認為Database.SetInitializer(new CreateDatabaseIfNotExists<MovieDbContext>());
//因此只需在web.config里配置好數據庫連接,只用下面這一句,就可以自動創建數據庫
//但重點注意的是,MVC WebApp里可以不引用EF6,但必須從其它引用過的地方,把EntityFramework.SqlServer.dll拷貝到WebApp的bin目錄,才能成功。
//在數據庫創建成功后,若有大的改動,可以取消第一種方法的注釋,用Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MovieDbContext>());
//刪除舊的數據庫,按新模型重建數據庫
34 public MovieDbContext() : base("name=MovieDbContext") { }
web.config,里的配置如下:
<connectionStrings>
<add name="MovieDbContext" connectionString="Data Source=(Local)\SQLEXPRESS;database=TestDb;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>
//方法三:
//下面這兩段,是指定數據庫名稱的參數的用法:
30 public MovieDbContext() 31 { 32 Database.SetInitializer<MovieDbContext>(null); 33 } 34 public MovieDbContext(string databasename) 35 : base(databasename) 36 { 37 } 38 //上面兩個構造函數同時使用用於創建自已命名的數據庫,必須在控制器文件中,顯示調用 39 //如: private MovieDbContext db = new MovieDbContext("MovieTest"); 40 //這樣才能在web.config配置中由 41 /* 42 <entityFramework> 43 <!--<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 44 <parameters> 45 <parameter value="v11.0" /> 46 </parameters> 47 </defaultConnectionFactory>--> 48 <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"> 49 <parameters> 50 <parameter value="Data Source=192.168.3.19;Initial Catalog=MovieTest;User ID=sa;Password=;MultipleActiveResultSets=True" /> 51 </parameters> 52 </defaultConnectionFactory> 53 <providers> 54 <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 55 </providers> 56 </entityFramework> 57 */ 58 //entityFramework中的defaultConnectionFactory所規定的連接屬性,定位到指定服務器,生成新的數據庫"MovieTest" 59 //下面這兩行分別可以調用web.config中配置的數據庫連接,但數據庫MovieTest或MovieDB都必須已經是預先存在的 60 /* 61 <connectionStrings> 62 <add name="MovieConnString" connectionString="Data Source=192.168.3.19;Initial Catalog=MovieDB;User ID=sa;Password=; 63 MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/> 64 <add name="MovieDbContext" connectionString="Data Source=192.168.3.19;Initial Catalog=MovieTest;User ID=sa;Password=; 65 MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/> 66 </connectionStrings> 67 */ 68 //public MovieDbContext() 69 // : base("name=MovieDbContext") 70 //{ 71 //} 72 //public MovieDbContext() 73 // : base("name=MovieConnString") 74 //{ 75 // Database.SetInitializer<MovieDbContext>(null); 76 //} 77 public DbSet<Movie> Movies { get; set; } 78 } 79 }
1.2、web.config文件中配置好EntityFrameWork的相關屬性
<entityFramework> <!--<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory>--> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"> <parameters> <parameter value="Data Source=192.168.3.19;Initial Catalog=MovieTest;User ID=sa;Password=;MultipleActiveResultSets=True" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework>
1.3、修改模型文件Movie.cs中的MovieDbContext類里的構造函數,並由控制器類MovieController.cs顯示傳參("自定義數據庫名稱")調用,即可生成自定義數據庫名稱:
public class MovieDbContext : DbContext { public MovieDbContext() { Database.SetInitializer<MovieDbContext>(null); } public MovieDbContext(string databasename) : base(databasename) { } //上面兩個構造函數同時使用用於創建自已命名的數據庫,必須在控制器文件中,顯示傳參調用才能生成自定義數據庫名 //"MovieTest",如:
public class MovieController : Controller
{
private MovieDbContext db = new MovieDbContext("MovieTest");
...
}
1.4、禁用默認表名復數形式。
Entity Framework Code First在根據類名來生成數據表時,生成的數據表表名默認會是類名的復數形式。可以用下述方法禁用復數形式:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 禁用默認表名復數形式 //需要先引用using System.Data.Entity.ModelConfiguration.Conventions; modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); //base.OnModelCreating(modelBuilder); }