1. 程式人生 > 實用技巧 >EF Core DBFirst 和Code First小結

EF Core DBFirst 和Code First小結

使用預設模板建立asp.net core api應用

CodeFirst程式碼

public class User
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public string Pwd { get; set; }

        public string Email { get; set; }

        public DateTime RegistTime { get; set; }

        public DateTime LastLoginTime { get; set; }

        public bool Status { get; set; }
    }
public class MyDbContext : DbContext
    {
        public DbSet<User> Users { get; set; }

        public MyDbContext(DbContextOptions options) : base(options)
        {
        }
    }
//startup檔案變更 sqlserver
public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
           //新增內容開始 services.AddDbContext<MyDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("ApiLoginCon")));
            //新增內容完成
        }
//startup mysql
public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddDbContext<MyDbContext>(options =>
            options.UseMySQL(Configuration.GetConnectionString("ApiLoginCon")));
        }

加入配置

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  //注意檢查server名稱是否和當前機器一致
  "ConnectionStrings": {
    "ApiLoginCon": "Server=(localdb)\\ProjectsV13;Database=EFGetStartedNewDb;Trusted_Connection=True;"
  }
  //Data Source=(localdb)\ProjectsV13;Initial Catalog=master;Integrated Security=True;
  //Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False
  
  //mysql:Data Source=127.0.0.1;Database=TestDb;User ID=root;Password=123456;pooling=true;port=3306;sslmode=none;CharSet=utf8;
}

安裝Nuget EF 支援庫

install-package Microsoft.EntityFrameworkCore 
install-package Microsoft.EntityFrameworkCore.Design

install-package Microsoft.EntityFrameworkCore.Tools

//sql server
install-package Microsoft.EntityFrameworkCore.SqlServer
//mysql
install-package MySql.Data
install-package MySql.Data.EntityFrameworkCore
install-package MySql.Data.EntityFrameworkCore.Design

編譯應用通過

初始化資料庫

--初始化資料庫

Add-Migration init //生成遷移版本目錄

Update-Database init //初始化資料庫

--更新版本

Add-Migration 1.0 //建立版本

Update-Database 1.0 //執行版本更新

命令 說明
Add-Migration version 新增一個新的遷移(名詞),version是遷移的名稱
remove-Migration 刪除上一次的遷移
Update-Database 更新最近一次的遷移到資料庫(有時候可能與原來的資料庫產生衝突,所以可能並不能遷移到資料庫)
Update-Database -Migration 0 表示清空資料庫,回到空資料庫狀態
Script-Migration [version] 檢視遷移指令碼,如果version就生成完整指令碼

導航屬性和外來鍵

規範命名是指符合:

命名為“[目標型別的鍵名],[目標型別名稱]+[目標型別鍵名稱]”,或“[導航屬性名稱]+[目標型別鍵名稱]”的形式,在這裡目標型別就是Destination,相對應的命名就是:DestinationId,DestinationDestinationId,TargetDestinationId

如果不按約定,就自己指定:

//方法一
[ForeignKey("Target")]
public int TarDestinationId { get; set; }
public Destination Target { get; set; }

//方法二
public int TarDestinationId { get; set; }
[ForeignKey("TarDestinationId")]
public Destination Target { get; set; }

//方法三
modelBuilder.Entity<Lodging>().HasRequired(p => p.Target).WithMany(l => l.Lodgings).HasForeignKey(p => p.TarDestinationId);

同一個實體多個引用的情況

如果不加屬性可能生成多個關聯外來鍵

//第一聯絡人
[InverseProperty("PrimaryContactFor")] 
public Person PrimaryContact { get; set; }
//第二聯絡人
[InverseProperty("SecondaryContactFor")] 
public Person SecondaryContact { get; set; } 

多對多關係

只要相互定義list導航屬性就可以

public class Activity
     {
         public int ActivityId { get; set; }
         [Required, MaxLength(50)] 
         public string Name { get; set; } 
         public List<Trip> Trips { get; set; }
     }

    public class Trip
    {
        public int TripId{get;set;}
        public DateTime StartDate{get;set;}
        public DateTime EndDate { get; set; }
        public decimal CostUSD { get; set; }
        public byte[] RowVersion { get; set; }
        public List<Activity> Activities { get; set; }
    }

如果想指定中間表的名稱和鍵,需要按如下設定

modelBuilder.Entity<Trip>().HasMany(t => t.Activities).WithMany(a => a.Trips).Map(m =>
                {
                    m.ToTable("TripActivities");
                    m.MapLeftKey("TripIdentifier");//對應Trip的主鍵
                    m.MapRightKey("ActivityId");
                });

或:

 modelBuilder.Entity<Activity>().HasMany(a => a.Trips).WithMany(t => t.Activities).Map(m =>
                {
                    m.ToTable("TripActivities");
                    m.MapLeftKey("ActivityId");//對應Activity的主鍵
                    m.MapRightKey("TripIdentifier");
                });


一對一關聯

互相定義導航屬性

DBFirst

在設計好資料結構後,執行如下命令:

Scaffold-DbContext -Connection "Server=.;Database=DevManager;uid=sa;pwd=p@ssw0rd" Microsoft.EntityFrameworkCore.SqlServer -OutputDir "." -force

生成dbcontext原始碼