如何在c#中为id列创建Guid-string

时间:2018-01-09 16:50:46

标签: c# asp.net sql-server asp.net-identity

当我查看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)
);
在show table数据中,我看到了id:

的值
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?

1 个答案:

答案 0 :(得分:0)

问题在于您正在尝试创建一个指向不存在的角色的链接(04B9CE68-61AE-4EC9-A38B-71823DC91026) - 问题正是如此。 如果您想自己创建角色,则可以使用Guid.NewGuid()方法为角色创建guid,并将DatabaseGeneratedOptionAttribute值更改为None 如果要创建具有指向现有角色的链接的用户,必须先通过某个参数(例如,名称)选择它,然后替换该值。 (例如5de2f031-e329-42b8-868e-c402acc18969