項目結構圖如下:
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 名字一樣
具體啥原因沒仔細研究