当前位置: 首页 > 编程语言 > C#

身份实体框架库-更新数据库分享

时间:2023-04-11 03:15:46 C#

身份实体框架库-更新数据库我刚刚更新了库Microsoft.AspNet.Identity.EntityFramework到最新版本(2.0.0.0),我发现在创建一个表犯了一些错误。当我生成迁移代码(up和down方法)时,我无法将更改上传到数据库,因为我执行“Updata-Database”时索引有问题指定的key太长;最大密钥长度为767字节以执行代码:publicoverridevoidUp(){CreateTable("dbo.AspNetRoles",c=>new{Id=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),Name=c.String(nullable:false,maxLength:256,storeType:"nvarchar"),}).PrimaryKey(t=>t.Id).Index(t=>t.Name,unique:true,name:"角色名称索引");CreateTable("dbo.AspNetUserRoles",c=>new{UserId=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),RoleId=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),}).PrimaryKey(t=>new{t.UserId,t.RoleId}).ForeignKey("dbo.AspNetRoles",t=>t.RoleId,cascadeDelete:true).ForeignKey("dbo.AspNetUsers",t=>t.UserId,cascadeDelete:true).Index(t=>t.UserId).Index(t=>t.RoleId);CreateTable("dbo.AspNetUsers",c=>new{Id=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),E邮件=c.String(maxLength:256,storeType:"nvarchar"),EmailConfirmed=c.Boolean(nullable:false),PasswordHash=c.String(maxLength:256,storeType:"nvarchar"),SecurityStamp=c.String(maxLength:256,storeType:"nvarchar"),PhoneNumber=c.String(maxLength:256,storeType:"nvarchar"),PhoneNumberConfirmed=c.Boolean(nullable:false),TwoFactorEnabled=c.Boolean(nullable:false),LockoutEndDateUtc=c.DateTime(precision:0),LockoutEnabled=c.Boolean(nullable:false),AccessFailedCount=c.Int(nullable:false),UserName=c.String(nullable:false,maxLength:256,storeType:"nvarchar"),}).PrimaryKey(t=>t.Id).Index(t=>t.UserName,unique:true,name:"UserNameIndex");CreateTable("dbo.AspNetUserClaims",c=>new{Id=c.Int(nullable:false,identity:true),UserId=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),ClaimType=c.String(maxLength:256,storeType:"nvarchar"),ClaimValue=c.String(maxLength:256,storeType:"nvarchar"),}).PrimaryKey(t=>t.Id).ForeignKey("dbo.AspNetUsers",t=>t.UserId,cascadeDelete:true).Index(t=>t.用户身份);CreateTable("dbo.AspNetUserLogins",c=>new{LoginProvider=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),ProviderKey=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),UserId=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),}).PrimaryKey(t=>new{t.LoginProvider,t.ProviderKey,t.UserId})。ForeignKey("dbo.AspNetUsers",t=>t.UserId,cascadeDelete:true).Index(t=>t.UserId);}publicoverridevoidDown(){DropForeignKey("dbo.AspNetUserRoles","UserId","dbo.AspNetUsers");DropForeignKey("dbo.AspNetUserLogins","UserId","dbo.AspNetUsers");DropForeignKey("dbo.AspNetUserClaims","UserId","dbo.AspNetUsers");DropForeignKey("dbo.AspNetUserRoles","RoleId","dbo.AspNetRoles");DropIndex("dbo.AspNetUserLogins",new[]{“用户身份”});DropIndex("dbo.AspNetUserClaims",new[]{"UserId"});DropIndex("dbo.AspNetUsers","UserNameIndex");DropIndex("dbo.AspNetUserRoles",new[]{"RoleId"});DropIndex("dbo.AspNetUserRoles",new[]{"UserId"});DropIndex("dbo.AspNetRoles","RoleNameIndex");DropTable("dbo.AspNetUserLogins");DropTable("dbo.AspNetUserClaims");DropTable("dbo.AspNetUsers");DropTable("dbo.AspNetUserRoles");DropTable("dbo.AspNetRoles");当我使用Microsoft.AspNet.Identity.EntityFrameworkversión1.0.0.0时,更新数据库的代码不同,我没有任何问题publicoverridevoidUp(){CreateTable("dbo.AspNetRoles",c=>new{Id=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),Name=c.String(nullable:false,maxLength:256,storeType:"nvarchar"),}).PrimaryKey(t=>t.Id);CreateTable("dbo.AspNetUsers",c=>new{Id=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),UserName=c.String(maxLength:256,storeType:"nvarchar"),密码哈希=c.String(maxLength:256,storeType:"nvarchar"),SecurityStamp=c.String(maxLength:256,storeType:"nvarchar"),Discriminator=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),}).PrimaryKey(t=>t.Id);CreateTable("dbo.AspNetUserClaims",c=>new{Id=c.Int(nullable:false,identity:true),ClaimType=c.String(maxLength:256,storeType:"nvarchar"),ClaimValue=c.String(maxLength:256,storeType:"nvarchar"),User_Id=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),}).PrimaryKey(t=>t.Id).ForeignKey("dbo.AspNetUsers",t=>t.User_Id,cascadeDelete:true).Index(t=>t.User_Id);CreateTable("dbo.AspNetUserLogins",c=>new{UserId=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),LoginProvider=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),ProviderKey=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),}).PrimaryKey(t=>new{t.UserId,t.LoginProvider,t.ProviderKey}).ForeignKey("dbo.AspNetUsers",t=>t.UserId,cascadeDelete:true).Index(t=>t.UserId);CreateTable("dbo.AspNetUserRoles",c=>new{UserId=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),RoleId=c.String(nullable:false,maxLength:128,storeType:"nvarchar"),}).PrimaryKey(t=>new{t.UserId,t.RoleId}).ForeignKey("dbo.AspNetRoles",t=>t.RoleId,cascadeDelete:true).ForeignKey("dbo.AspNetUsers",t=>t.UserId,cascadeDelete:true).Index(t=>t.UserId).Index(t=>t.RoleId);}publicoverridevoidDown(){DropForeignKey("dbo.AspNetUserRoles","UserId","dbo.AspNetUsers");DropForeignKey("dbo.AspNetUserLogins","UserId","dbo.AspNetUsers");DropForeignKey("dbo.AspNetUserClaims","UserId","dbo.AspNetUsers");DropForeignKey("dbo.AspNetUserRoles","RoleId","dbo.AspNetRoles");DropIndex("dbo.AspNetUserLogins",new[]{"UserId"});DropIndex("dbo.AspNetUserClaims",new[]{"UserId"});DropIndex("dbo.AspNetUsers","UserNameIndex");DropIndex("dbo.AspNetUserRoles",new[]{"RoleId"});DropIndex("dbo.AspNetUserRoles",new[]{"UserId"});DropIndex("dbo.AspNetRoles","RoleNameIndex");DropTable("dbo.AspNetUserLogins");DropTable("dbo.AspNetUserClaims");DropTable("dbo.AspNetUsers");DropTable("dbo.AspNetUserRoles");DropTable("dbo.AspNetRoles");谁能帮我解决这个问题?提前致谢!!您可能想查看本教程:http://www.asp.net/mvc/tutorials/security/aspnet-identity-using-mysql-storage-with-an-entityframework-mysql-provider-特别是“添加”定义MigrationHistory上下文部分”,它解释了如何设置自定义HistoryContext以解决主键大小问题我知道这是一篇旧文章,但我今天遇到了同样的问题并对其进行了一些调查,并想分享我的发现和解决方案。问题是Microsoft在版本之间的AspNetRoles的名称列上添加了唯一索引,并且由于该列的大小为256,因此它违反了MySql的索引规则。问题也发生在AspNetUsers的名称列上.于是,我就去分析如何解决这个问题,我认为最正确的做法是减少Name列的长度(恕我直言,角色/用户名真的没有理由要长)。在调查了IdentityDbContext(基类)上的代码之后,我认为解决这个问题最正确的方法是重写ApplicationDbContext的OnModelCreating并像这样调整列的大小:publicclassApplicationDbContext:IdentityDbContext{//...defaultcodeforApplicationDbContextprotectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){if(modelBuilder==null){thrownewArgumentNullException("modelBuilder");}base.OnModelCreating(modelBuilder);modelBuilder.Entity().Property(u=>u.UserName).HasMaxLength(128);//取消注释这也有电子邮件长度128(不是必需的)//modelBuilder.Entity().Property(u=>u.Email).HasMaxLength(128);模型构建器.Entity()。Property(r=>r.Name).HasMaxLength(128);此代码将使用base.OnModelCreating调用使用默认配置初始化身份模型,然后使用我们自己的调用覆盖在基类中完成的设置。由于您正在创建一个迁移项目,因此您需要重新运行迁移创建以获取更新的模型(或手动修改模型以调整列的大小)。这将解决问题,您将拥有Asp.NETIdentity系统的全部功能。当然,为了在创建项目时不出现任何错误,您只需要修改迁移代码,但是您将拥有与您的上下文定义不同的模型,这可能会导致问题。这可能是因为您的数据库使用UTF8排序规则。解决此问题的一种可能方法是将代码中包含maxLength:256的所有部分更改为maxLength:190。另一种方法是将数据库上的UTF8归类更改为latin1或类似的。以上就是C#学习教程:Identity实体框架库-更新数据库分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: