无需身份自动生成Guid

时间:2018-03-30 06:30:59

标签: .net asp.net-mvc asp.net-core entity-framework-core guid

EF Core MVC,Code First。

我希望在我的Guest表上有一个字段,它是一个Database Generated Guid。我不希望它成为PK,我使用int ID作为PK。 Guid用于其他目的。此外,理想情况下,无论用户是否登录到应用程序,都会生成此字段。

我尝试在我的模型上使用它:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid GuestGuid { get; set; }

我的数据初始值设定项不会创建任何来宾,当我尝试手动创建来宾时会抛出错误,说明" GuestGuid"字段不能为空。

如果我删除DBGenerated部分:

public Guid GuestGuid { get; set; }

然后它只为每个创建的客户生成一个全零的guid。

我想最终从CSV或类似的数据导入数据,所以我需要这个值由SQL数据库自动生成,否则,我可以在Create方法上使用guest.GuestGuid = System.Guid.NewGuid();

我认为我的映射中有一些东西,我是否需要修改我的GuestContextClass?

public class GuestContext : DbContext
{
    public GuestContext(DbContextOptions<GuestContext> options): base(options)
    {
    }

    public DbSet<Guest> Guests { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Guest>().ToTable("Guest");
    }
}

请帮助,我确定我已经关闭了,但我远不及.NET的专家。

经过更多的研究后我想澄清一下,我希望这个字段(可能应该是一个字符串&gt;)每当添加一行时自动生成随机Guid,就像使用身份验证时为ASPUsers生成ID一样。

3 个答案:

答案 0 :(得分:0)

您应该在模型类中使用public Guid GuestGuid { get; set; } = new Guid();。所以它将使用新的guid而不是null初始化。

答案 1 :(得分:0)

在你的模型中定义这样的id。

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public Guid Id { get; set; }

这将自动生成guid

更新#1

public class Product
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ProductID { get; set; }

    public Guid ProductGuid { get; set; } = Guid.NewGuid();

    public string Name { get; set; }
}

更新#2

如果你想要一个不是pk的字段,但它会自动增加它的值,那么你可以这样定义:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int NoPrimaryKeyAutoIncrementField { get; set; }

答案 2 :(得分:0)

以下是我最终要做的事情,感谢您的建议和帮助。

我把它放在我的模型中(我将Guid改为字符串):

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string ProductGuid { get; set; } = Guid.NewGuid().ToString();

上面的工作用于自动生成一个唯一的非键gui​​d,但是当我从我的SQL服务器直接导入CSV或excel时,它不起作用,所以我写了一个简单的程序来填充来自控制器。

public async Task<IActionResult> AddGuis()
        {
            var prods = _context.Products.Where(g => String.IsNullOrWhiteSpace(g.ProductGuid)).AsNoTracking();
            foreach(Product g in prods)
            {
                g.ProductGuid= Guid.NewGuid().ToString();
                _context.Update(g);
            }
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }