EF Code First數據庫連接配置

 

  通過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);
        }

 

 




  通過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);
        }