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一样。
答案 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();
上面的工作用于自动生成一个唯一的非键guid,但是当我从我的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));
}