首頁 Entity Framework Code First if DataBase Exist3
文章
Cancel

Entity Framework Code First if DataBase Exist3

前言

使用Fluent Api修改資料表型態、名稱等方式
好處:較能達成程式碼的耦合分離
以變更現有資料表NewDataSheets的設定為例 欄位設定如附圖
Desktop View

1.建議新增統一放置Config的資料夾,並在其中加入新的cs檔

例如NewDataSheetConfig.cs

1
2
3
4
5
6
7
8
9
10
11
12
  namespace CodeFirst.Config
  {
      using System.Data.Entity.ModelConfiguration;
      public class NewDataSheetConfig : EntityTypeConfiguration<NewDataSheet>
      {
          public NewDataSheetConfig()
          {
              //這裡用來設定這張資料表要變成怎樣的設定
              //指令下面示範
          }
      }
  }

如附圖
Desktop View

2.變更Model1.cs底下的OnModelCreating的寫法

更改前

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  namespace CodeFirst
  {
      public partial class Model1 : DbContext
      {
          public Model1()
              : base("name=Model1")
          {
          }

          public virtual DbSet<Member> Members { get; set; }
          public virtual DbSet<NewDataSheet> NewDataSheet { get; set; }
          protected override void OnModelCreating(DbModelBuilder modelBuilder)
          {
              modelBuilder.Entity<Member>()
                  .Property(e => e.UserName)
                  .IsUnicode(false);

              modelBuilder.Entity<Member>()
                  .Property(e => e.UserEmail)
                  .IsUnicode(false);
          }
      }
  }

更改後

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  namespace CodeFirst
  {
      public partial class Model1 : DbContext
      {
          public Model1()
              : base("name=Model1")
          {
          }

          public virtual DbSet<Member> Members { get; set; }
          public virtual DbSet<NewDataSheet> NewDataSheet { get; set; }
          protected override void OnModelCreating(DbModelBuilder modelBuilder)
          {
              modelBuilder.Entity<Member>()
                  .Property(e => e.UserName)
                  .IsUnicode(false);

              modelBuilder.Entity<Member>()
                  .Property(e => e.UserEmail)
                  .IsUnicode(false);

              modelBuilder.Configurations.Add(new Config.NewDataSheetConfig());
          }
      }
  }

3.設定所需變更的資料

例如我希望Name的資料型態長度是20

1
2
3
4
5
6
7
8
9
10
11
  namespace CodeFirst.Config
  {
      using System.Data.Entity.ModelConfiguration;
      public class NewDataSheetConfig : EntityTypeConfiguration<NewDataSheet>
      {
          public NewDataSheetConfig()
          {
              Property(t => t.Name).HasMaxLength(20);
          }
      }
  }

4.執行Add-Migration

指令:

1
 Add-Migration SetMaxLength

如附圖
Desktop View

5.執行更新Update-Database

指令:

1
 Update-Database

如附圖
Desktop View

到SQL Server中 可以看到以完成欄位長度的修正 Desktop View

6.還原Migration版本的方式

!!!但是不建議如次操作,因為修改後若要Update,會遺失中間的Migration留存紀錄

1
 Update-Database -TargetMigration: OddDataSheetReNameNameTo_Name

OddDataSheetReNameNameTo_Name為Migrations資料夾底下的檔名
如圖所示 Desktop View

以下是Fluent Api可以參考的指令

Desktop View 變更TableName↓

1
 ToTable("NewDataSheet","Hellow")

配置主鍵↓

1
 HasKey(t=>t.Name);

配置複合鍵↓

1
 HasKey(t=>new{t.id , t.Name});

變更藍位名稱↓

1
 Property(t => t.Name).HasColumnName("sName");

變更欄位型態↓

1
 Property(t => t.Name).HasColumnType("varchar");

不使用Visual Studio中生成的資料表設定,而是直接使用已存在於資料庫的欄位設定

1
 Property(t => t.Name).HasDatabaseGenerated(DatabaseGeneratedOption.None)

  Not Null設定

1
 Property(t=>t.Name).IsRequired();

變更字串長度↓

1
 .Property(t=>t.Name).HasMaxLength(255);
本文由作者按照 CC BY 4.0 進行授權