<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      創(chuàng)建數(shù)據(jù)庫遷移

      返回總目錄《一步一步使用ABP框架搭建正式項(xiàng)目系列教程》


      這一節(jié)我們說說數(shù)據(jù)庫遷移(Migration)。

      我們之前用的DBFirst創(chuàng)建了實(shí)體類,但當(dāng)初這么做的原因是為了節(jié)省時(shí)間。現(xiàn)在我們通過創(chuàng)建的實(shí)體類和DbContext類利用EF的Code First數(shù)據(jù)庫遷移反過來創(chuàng)建數(shù)據(jù)庫。ABP模板默認(rèn)開啟了遷移,并且添加了一下下面的Configuration類:

      namespace Noah.ChargeStation.Migrations
      {
          internal sealed class Configuration : DbMigrationsConfiguration<ChargeStation.EntityFramework.ChargeStationDbContext>
          {
              public Configuration()
              {
                  AutomaticMigrationsEnabled = false;
                  ContextKey = "ChargeStation";
              }
              /// <summary>
              /// 添加種子數(shù)據(jù),比如默認(rèn)管理員等數(shù)據(jù)
              /// </summary>
              /// <param name="context">當(dāng)前數(shù)據(jù)庫上下文子類</param>
              protected override void Seed(ChargeStation.EntityFramework.ChargeStationDbContext context)
              {
                  context.DisableAllFilters();
                  new InitialDataBuilder(context).Build();
              }
          }
      }
      namespace Noah.ChargeStation.Migrations.SeedData
      {
          public class DefaultTenantRoleAndUserBuilder
          {
              private readonly ChargeStationDbContext _context;
      
              public DefaultTenantRoleAndUserBuilder(ChargeStationDbContext context)
              {
                  _context = context;
              }
      
              public void Build()
              {
                  CreateUserAndRoles();
              }
      
              private void CreateUserAndRoles()
              {
                  //Admin role for tenancy owner
      
                  var adminRoleForTenancyOwner = _context.Roles.FirstOrDefault(r => r.TenantId == null && r.Name == "Admin");
                  if (adminRoleForTenancyOwner == null)
                  {
                      adminRoleForTenancyOwner = _context.Roles.Add(new Role { Name = "Admin", DisplayName = "Admin", IsStatic = true });
                      _context.SaveChanges();
                  }
      
                  //Admin user for tenancy owner
      
                  var adminUserForTenancyOwner = _context.Users.FirstOrDefault(u => u.TenantId == null && u.UserName == "admin");
                  if (adminUserForTenancyOwner == null)
                  {
                      adminUserForTenancyOwner = _context.Users.Add(
                          new User
                          {
                              TenantId = null,
                              UserName = "admin",
                              Name = "System",
                              Surname = "Administrator",
                              EmailAddress = "admin@aspnetboilerplate.com",
                              IsEmailConfirmed = true,
                              Password = "AM4OLBpptxBYmM79lGOX9egzZk3vIQU3d/gFCJzaBjAPXzYIK3tQ2N7X4fcrHtElTw==" //123qwe
                          });
      
                      _context.SaveChanges();
      
                      _context.UserRoles.Add(new UserRole(adminUserForTenancyOwner.Id, adminRoleForTenancyOwner.Id));
      
                      _context.SaveChanges();
                  }
      
                  //Default tenant
      
                  var defaultTenant = _context.Tenants.FirstOrDefault(t => t.TenancyName == "Default");
                  if (defaultTenant == null)
                  {
                      defaultTenant = _context.Tenants.Add(new Tenant { TenancyName = "Default", Name = "Default" });
                      _context.SaveChanges();
                  }
      
                  //Admin role for 'Default' tenant
      
                  var adminRoleForDefaultTenant = _context.Roles.FirstOrDefault(r => r.TenantId == defaultTenant.Id && r.Name == "Admin");
                  if (adminRoleForDefaultTenant == null)
                  {
                      adminRoleForDefaultTenant = _context.Roles.Add(new Role { TenantId = defaultTenant.Id, Name = "Admin", DisplayName = "Admin", IsStatic = true });
                      _context.SaveChanges();
                  }
      
                  //Admin for 'Default' tenant
      
                  var adminUserForDefaultTenant = _context.Users.FirstOrDefault(u => u.TenantId == defaultTenant.Id && u.UserName == "admin");
                  if (adminUserForDefaultTenant == null)
                  {
                      adminUserForDefaultTenant = _context.Users.Add(
                          new User
                          {
                              TenantId = defaultTenant.Id,
                              UserName = "admin",
                              Name = "System",
                              Surname = "Administrator",
                              EmailAddress = "admin@aspnetboilerplate.com",
                              IsEmailConfirmed = true,
                              Password = "AM4OLBpptxBYmM79lGOX9egzZk3vIQU3d/gFCJzaBjAPXzYIK3tQ2N7X4fcrHtElTw==" //123qwe
                          });
                      _context.SaveChanges();
      
                      _context.UserRoles.Add(new UserRole(adminUserForDefaultTenant.Id, adminRoleForDefaultTenant.Id));
                      _context.SaveChanges();
                  }
              }
          }
      }

      在Seed方法中,添加了租戶,角色和用戶數(shù)據(jù)。現(xiàn)在,我來創(chuàng)建初始化遷移。打開包管理器控制臺,輸入下面的命令:

      image

      此處特別注意,紅色方框中一定不要忘了選擇EF項(xiàng)目,否則不會有下面出現(xiàn)的命令“Add-Migration”,”InitialData”是生成文件的后綴名(也是文件中類的名字),也可以取其他名字。

      image

      image

      可以看到生成的文件一個(gè)以cs結(jié)尾,這里面的代碼是創(chuàng)建數(shù)據(jù)庫中表的,另一個(gè)以Designer.cs結(jié)尾,記錄的是數(shù)據(jù)庫遷移的版本記錄,最后一個(gè)以.resx文件是資源文件,暫且不需要考慮。

      剛才我們只是創(chuàng)建了創(chuàng)建數(shù)據(jù)庫所需要的類,但還沒有創(chuàng)建數(shù)據(jù)庫。為了創(chuàng)建數(shù)據(jù)庫,需要在包管理控制臺執(zhí)行以下命令:

      PM> Update-Database
       

      該命令完成了這次數(shù)據(jù)庫的遷移,創(chuàng)建了數(shù)據(jù)庫并填充了種子數(shù)據(jù)。

      image

      當(dāng)我們改變實(shí)體類時(shí),可以使用Add-Migration命令創(chuàng)建新的遷移類和Update-Database命令更新數(shù)據(jù)庫。

      至此,數(shù)據(jù)庫遷移完成。下一次我們說說《定義倉儲》。

      posted @ 2015-10-31 17:44  tkbSimplest  閱讀(17731)  評論(8)    收藏  舉報(bào)
      主站蜘蛛池模板: 久久国内精品自在自线91| 国产欧美另类久久久精品不卡| 国产蜜臀一区二区在线播放| 亚洲综合色在线视频WWW| av午夜久久蜜桃传媒软件| 久久人人97超碰精品| 久久精品国产高潮国产夫妻| AV免费播放一区二区三区| 久久国产精品无码网站| 亚洲 欧美 中文 日韩aⅴ| 国产性色的免费视频网站| 日本中文字幕乱码免费| 又大又硬又爽免费视频| 欧洲码亚洲码的区别入口| 亚洲av综合色区无码专区| 亚洲一区久久蜜臀av| 久久精品高清一区二区三区| 久久亚洲精品情侣| 大胸美女被吃奶爽死视频| av无码精品一区二区乱子| 欧美老熟妇乱子伦牲交视频| 天堂…中文在线最新版在线| 日韩不卡一区二区在线观看| 国产成A人片在线观看视频下载| 亚洲精品久久久久成人2007| 日韩在线不卡免费视频一区| 国产丰满乱子伦无码专区| 欧美日韩精品一区二区三区在线| 亚洲精品乱码久久久久久中文字幕| 久久这里只有精品好国产| 国产一区二区三区小说| 图片区 小说区 区 亚洲五月| 高清国产亚洲精品自在久久| 亚洲欧美人成人让影院| 自拍视频在线观看成人| 国产精品天天看天天狠| 国产精品午夜福利视频234区| 久久精品国产成人午夜福利 | 国产偷国产偷亚洲综合av| 国产亚洲天堂另类综合| 美女爽到高潮嗷嗷嗷叫免费网站 |