当我查看asp.net Identity 2样本时,我发现了一个有趣的观点。
这里的要点是在 id列中使用 Guid 。当我对表定义(例如:AspNetRoles表)时,我看到了以下命令:
CREATE TABLE [dbo].[AspNetRoles] (
[Id] NVARCHAR (128) NOT NULL,
[Name] NVARCHAR (256) NOT NULL,
CONSTRAINT [PK_dbo.AspNetRoles] PRIMARY KEY CLUSTERED ([Id] ASC)
);
5de2f031-e329-42b8-868e-c402acc18969
非常喜欢 Guid
我也去了models文件夹,看到 RoleViewModel 模型
public class RoleViewModel
{
public string Id { get; set; }
[Required(AllowEmptyStrings = false)]
[Display(Name = "RoleName")]
public string Name { get; set; }
}
我决定更改项目中的列,如上面的代码(字符串Guid)
我将模型从长ID 更改为 Guid Id
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual Guid Id { get; set; }
但在我的表中定义是:
[Id] UNIQUEIDENTIFIER DEFAULT (newsequentialid()) NOT NULL,
我知道我必须将 Guid 更改为字符串,但数据库如何自动将 Guid 转换为字符串 ? (我的意思是自动增量sql server部分或属性函数[DatabaseGenerated(DatabaseGeneratedOption.Identity)])
此外,还特别遇到以下为Guid编写的代码:
public bool RegisterUser(RegisterViewModel registerViewModel)
{
try
{
var currentUser = (from u in _allUsers.AsParallel().AsUnordered() where u.EnDecryptedMobileNumber == registerViewModel.MobilePhone select u).FirstOrDefault();
if (currentUser != null)
{
return false;
}
byte[] salt = _hashingClass.GenerateSalt();
byte[] key = _aesCryptography.GenerateRandomNumber(32);
byte[] iv = _aesCryptography.GenerateRandomNumber(16);
User user = new User()
{
Key = key,
Iv = iv,
Salt = salt,
EnDecryptedMobileNumber = registerViewModel.MobilePhone,
EnDecryptedPassword = Convert.ToBase64String(_hashingClass.HashPassword(Encoding.UTF8.GetBytes(registerViewModel.Password), salt, 100000)),
RoleId = Guid.Parse("04B9CE68-61AE-4EC9-A38B-71823DC91026"),
Status = StatusType.Accepted,
RegisterDate = DateTime.Now,
LastEntryDate = DateTime.Now,
Sex = registerViewModel.Sex
};
base.Add(user);
return true;
}
catch (Exception e)
{
return false;
}
}
和执行:
{" INSERT语句与FOREIGN KEY约束冲突 \" FK_dbo.Users_dbo.Roles_RoleId \&#34 ;.冲突发生在数据库中 \" GbDb \",表\" dbo.Roles \",列' Id'。声明已被删除 终止"}
--- ---更新
我首先使用了entityframwork代码,我在 Configuration.cs 文件中初始化了该角色:
context.Roles.AddOrUpdate(r => r.Id,
new Role() { Id = Guid.ParseExact("04B9CE68-61AE-4EC9-A38B-71823DC91026", "D"), RoleInSystem = "User", RoleName = "user" },
new Role() { Id = Guid.ParseExact("A79383E3-E22D-46AE-8EE6-E61873315BED", "D"), RoleInSystem = "Coach", RoleName = "coach" },
new Role() { Id = Guid.ParseExact("16BE238F-94B3-4B23-B3A9-10B697707138", "D"), RoleInSystem = "Admin", RoleName = "admin" }
);
(通过visual studio手动创建Guid)
但是当执行 update-database 和runnig seed方法时,id会更改为新值并存储在数据库中! (我不知道为什么)
我的问题是如何创建 string-Guid 类型,例如identity 2 id列类型,并为每条记录创建自动?
第二个问题为什么在运行种子方法时将id更改为新的guid?
答案 0 :(得分:0)
问题在于您正在尝试创建一个指向不存在的角色的链接(04B9CE68-61AE-4EC9-A38B-71823DC91026
) - 问题正是如此。
如果您想自己创建角色,则可以使用Guid.NewGuid()
方法为角色创建guid,并将DatabaseGeneratedOptionAttribute
值更改为None
如果要创建具有指向现有角色的链接的用户,必须先通过某个参数(例如,名称)选择它,然后替换该值。 (例如5de2f031-e329-42b8-868e-c402acc18969
)