NetCore下使用EFCore CodeFirst 方式創建更新數據庫


項目結構圖如下:

 

 

 

IService 主要是接口 ,Service 是服務處理,Models 各種數據實體,Repository 數據訪問處理

 

1、首先在Models 項目下創建類

復制代碼
 1 namespace Models
 2 {
 3     [Table("User")]
 4    public class BaseUser
 5     {
 6         [Key]
 7         [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
 8         public int Id { get; set; }
 9         [MaxLength(20)]
10         public string UserName { get; set; }
11     }
12 }
復制代碼
復制代碼
 1 namespace Models
 2 {
 3     [Table("Role")]
 4     public class Role
 5     {
 6         [Key]
 7         [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
 8         public int Id { get; set; }
 9         [MaxLength(20)]
10         [Required]
11         public string RoleName { get; set; }
12         
13     }
14 }
復制代碼
復制代碼
 1 namespace Models
 2 {
 3     [Table("UserRole")]
 4    public class UserRole
 5     {
 6         [Key]
 7         [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
 8         public int Id { get; set; }
 9         [ForeignKey("UserID")]
10         public virtual BaseUser User { get; set; }
11         [ForeignKey("RoleID")]
12         public virtual Role Role { get; set; }
13 
14     }
15 }
復制代碼

2、在 Repository 項目下創建DbContext類

復制代碼
 1 namespace Repository
 2 {
 3     public partial class MiveDb:DbContext
 4     {
 5         public MiveDb()
 6         {
 7 
 8         }
 9 
10         public MiveDb(DbContextOptions<MiveDb> options)
11             :base(options)
12         {
13 
14         }
15 
16         protected override void OnModelCreating(ModelBuilder modelBuilder)
17         {
18             base.OnModelCreating(modelBuilder);
19         }
20 
21         public virtual DbSet<Movie> Movie { get; set; }
22         public virtual DbSet<BaseUser> User { get; set; }
23         public virtual DbSet<Role> Role { get; set; }
24         public virtual DbSet<UserRole> UserRole { get; set; }
25     }
26 }
復制代碼

3、在Web項目下的appsettings.json文件中添加數據庫連接字符串,添加后如下:

復制代碼
 1 {
 2   "Logging": {
 3     "LogLevel": {
 4       "Default": "Warning"
 5     }
 6   },
 7   "AllowedHosts": "*",
 8   "ConnectionStrings": {
 9     "DefaultConnection": "Data Source=127.0.0.1;Initial Catalog=MovieDb;user id=sa;password=sa@123;Max Pool Size=512;Min Pool Size=5"
10   }
11 }
復制代碼

4、在webapp 配置 Startup.cs 下進行配置

  4.1  創建一個方法用於程序集注入

    

復制代碼
 1  /// <summary>  
 2         /// 自動注冊服務——獲取程序集中的實現類對應的多個接口
 3         /// </summary>
 4         /// <param name="services">服務集合</param>  
 5         /// <param name="assemblyName">程序集名稱</param>
 6         public void AddAssembly(IServiceCollection services, string assemblyName)
 7         {
 8             if (!String.IsNullOrEmpty(assemblyName))
 9             {
10                 Assembly assembly = Assembly.Load(assemblyName);
11                 List<Type> ts = assembly.GetTypes().Where(u => u.IsClass && !u.IsAbstract && !u.IsGenericType).ToList();
12                 foreach (var item in ts.Where(s => !s.IsInterface))
13                 {
14                     var interfaceType = item.GetInterfaces();
15                     if (interfaceType.Length == 1)
16                     {
17                         services.AddTransient(interfaceType[0], item);
18                     }
19                     if (interfaceType.Length > 1)
20                     {
21                         services.AddTransient(interfaceType[1], item);
22                     }
23                 }
24             }
25         }
26    
復制代碼

    4.2  在 Startup.cs 中 ConfigureServices 方法中添加注入

復制代碼
1  AddAssembly(services, "IService");
2             AddAssembly(services, "Service");
3             services.AddDbContext<MiveDb>(options =>
4             {
5                 var connection = Configuration.GetConnectionString("DefaultConnection");
6                 options.UseSqlServer(
7                     connection
8                     );
9             });
復制代碼

    4.3 按照項目需要,引用個項目

5、打開命令行控制台,切換到 Repository 項目

PM> Add-Migration FirstMigration

執行以上命令,備注:

FirstMigration  名字任意取

中間可能會遇見各種問題,主要是各個項目之間的引用就可以解決

執行成功后,Repository 中會出現 如圖

 

 

 但是發現在TestMovieDB.cs這個文件中有一個錯誤  

SqlServerValueGenerationStrategy 缺少引用
復制代碼
  1 namespace Repository.Migrations
  2 {
  3     public partial class TestMovieDB : Migration
  4     {
  5         protected override void Up(MigrationBuilder migrationBuilder)
  6         {
  7             migrationBuilder.CreateTable(
  8                 name: "Movie",
  9                 columns: table => new
 10                 {
 11                     Id = table.Column<int>(nullable: false)
 12                         .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
 13                     Title = table.Column<string>(maxLength: 50, nullable: true),
 14                     Info = table.Column<string>(maxLength: 500, nullable: true),
 15                     CreateTime = table.Column<DateTime>(nullable: false)
 16                 },
 17                 constraints: table =>
 18                 {
 19                     table.PrimaryKey("PK_Movie", x => x.Id);
 20                 });
 21 
 22             migrationBuilder.CreateTable(
 23                 name: "Role",
 24                 columns: table => new
 25                 {
 26                     Id = table.Column<int>(nullable: false)
 27                         .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
 28                     RoleName = table.Column<string>(maxLength: 20, nullable: false)
 29                 },
 30                 constraints: table =>
 31                 {
 32                     table.PrimaryKey("PK_Role", x => x.Id);
 33                 });
 34 
 35             migrationBuilder.CreateTable(
 36                 name: "User",
 37                 columns: table => new
 38                 {
 39                     Id = table.Column<int>(nullable: false)
 40                         .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
 41                     UserName = table.Column<string>(maxLength: 20, nullable: true)
 42                 },
 43                 constraints: table =>
 44                 {
 45                     table.PrimaryKey("PK_User", x => x.Id);
 46                 });
 47 
 48             migrationBuilder.CreateTable(
 49                 name: "UserRole",
 50                 columns: table => new
 51                 {
 52                     Id = table.Column<int>(nullable: false)
 53                         .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
 54                     UserID = table.Column<int>(nullable: true),
 55                     RoleID = table.Column<int>(nullable: true)
 56                 },
 57                 constraints: table =>
 58                 {
 59                     table.PrimaryKey("PK_UserRole", x => x.Id);
 60                     table.ForeignKey(
 61                         name: "FK_UserRole_Role_RoleID",
 62                         column: x => x.RoleID,
 63                         principalTable: "Role",
 64                         principalColumn: "Id",
 65                         onDelete: ReferentialAction.Restrict);
 66                     table.ForeignKey(
 67                         name: "FK_UserRole_User_UserID",
 68                         column: x => x.UserID,
 69                         principalTable: "User",
 70                         principalColumn: "Id",
 71                         onDelete: ReferentialAction.Restrict);
 72                 });
 73 
 74             migrationBuilder.CreateIndex(
 75                 name: "IX_UserRole_RoleID",
 76                 table: "UserRole",
 77                 column: "RoleID");
 78 
 79             migrationBuilder.CreateIndex(
 80                 name: "IX_UserRole_UserID",
 81                 table: "UserRole",
 82                 column: "UserID");
 83         }
 84 
 85         protected override void Down(MigrationBuilder migrationBuilder)
 86         {
 87             migrationBuilder.DropTable(
 88                 name: "Movie");
 89 
 90             migrationBuilder.DropTable(
 91                 name: "UserRole");
 92 
 93             migrationBuilder.DropTable(
 94                 name: "Role");
 95 
 96             migrationBuilder.DropTable(
 97                 name: "User");
 98         }
 99     }
100 }
復制代碼

 沒關系,這個問題明顯是缺少 對dll 的引用,我們引用即可

接着引用 Microsoft.EntityFrameworkCore.SqlServer  dll,版本根據實際需求引用 

這個時候雖然成功了,但是數據庫中的數據還未被創建

6、執行數據庫更新操作

 1 PM> Update-Database -Verbose 

 

 

 出現這些就表示成功了,接着我們看數據庫

 

 

 

此時數據庫已經創建好了!

 

7、有沒有發現數據庫的名稱和我們DbContext  名字一樣

具體啥原因沒仔細研究


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM