分類  >  資料庫 >

Entity Framework Database/Code First實現對錶開展壓縮配置

tags:    時間:2014-05-04 12:36:11
Entity Framework Database/Code First實現對錶進行壓縮配置

我採用Database First,用Sql很容易就可以做到對一個表進行壓縮。如以下:

CREATE TABLE [dbo].[Entities](      [Id] [int] IDENTITY(1,1) NOT NULL,      [Name] [nvarchar](max) NULL,       Primary Key Clustered ([Id] ASC) WITH (DATA_COMPRESSION=PAGE)  );

遺憾的是當我採用Database First反向之後。再利用反向後的DbContext(我命名為MyContext)自動生成另外一個資料庫時,我發現新生成的資料庫里並沒有對Entities這個表進行Page級別的壓縮,或者說壓根就沒有壓縮。

因為在同一個MyContext下我要求可以自動生成新的資料庫。Database First反向之後,再利用DbContext去生成新的資料庫,這就有點類似於Code Frist了。一開始,我是打算override OnModelCreating(DbModelBuilder modelBuilder)在這裡實現的。兩方面的原因讓我發現做不到。首先,我沒能找到相應的C#版本的Api;其次,如同這個方法的名稱一樣,在模型的創建時,相關的表還沒有建立出來,因此我無法對錶進行修改。

最後,我只能採用另一種方式了。繼承 CreateDatabaseIfNotExists類,並override Seed(MyContext context)方法了。這個方法的執行時間是在資料庫第一次生成之後。這個時候是最適合對錶進行修改的。具體如下:

  public class CreateDatabaseWithCompressionIfNotExists : CreateDatabaseIfNotExists<MyContext>     {         protected override void Seed(testEntities context)         {             var cmd = new SqlCommand();             var con = new SqlConnection(context.Database.Connection.ConnectionString);             con.Open();             cmd.Connection = con;             cmd.CommandType = CommandType.Text;              cmd.CommandText = "alter table entities rebuild with (data_compression=page);";              cmd.ExecuteNonQuery();         }     }
Main函數里的調用 :
 private static void Main(string[] args)         {             Database.SetInitializer(new CreateDatabaseWithCompressionIfNotExists());  //這裡就會調用實現對錶的修改了。             var test = new testEntities();             test.Entities.Add(new Model.Entity());             test.SaveChanges();         }



具體查看是否進行壓縮的一種方式:
在:Microsoft SQL SERVER Management Studio里 "右鍵"相應的表->Properties->Storage->Compresion 這裡可以看到相應的Compression type


具體查看是否進行壓縮的一種方式:
在:Microsoft SQL SERVER Management Studio里 "右鍵"相應的表->Properties->Storage->Compresion 這裡可以看到相應的Compression type

推薦閱讀文章

Bookmark the permalink ,來源:互聯網