我无法为主键生成新的guid ID。每次我尝试创建另一个用户时都会得到相同的错误,因为它不会生成新的guid id。
违反PRIMARY KEY约束' PK_User'。无法插入重复 密钥对象' dbo.User'。重复的键值是 (00000000-0000-0000-0000-000000000000)。声明一直如此 终止。
代码:
public partial class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public System.Guid Id { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
我的UserController代码
[HttpGet]
public ActionResult Create() {
return View();
}
[HttpPost]
public ActionResult Create(User user) {
if (ModelState.IsValid) {
db.Users.Add(user);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(user);
}
如何自动生成新指南?
答案 0 :(得分:1)
您的c#代码未生成任何GUID,因为您正在指示它执行此操作。您的模型表示Id的值由数据库生成(DatabaseGenerated(DatabaseGeneratedOption.Identity)
)
问题出在数据库中的表定义中。如果您正在使用SQL Server,请使用SQL Server management studio,检查表的定义并确保ID实际定义为“Identity”
答案 1 :(得分:1)
你可以在像这样的类的构造函数中做到
public User()
{
this.Id= Guid.NewGuid();
}
答案 2 :(得分:1)
使用返回类型定义主键Id
是一个字符串:
public partial class User
{
[Key]
public string Id { get; set; }
...
}
[HttpPost]
public ActionResult Create(User user)
{
if (ModelState.IsValid)
{
user.Id = Guid.NewGuid().ToString(); // handling new id
// if you want to check duplicate:
bool exist = db.Users.SingleOrDefault(x => x.Id == user.Id) != null;
if (exist)
{
// code for duplicate key...
}
db.Users.Add(user);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(user);
}
答案 3 :(得分:1)
你的PK是一个GUID,我不知道任何DBMS实际上为GUID列实现了某种自动增量,因为这没有多大意义。
这就是为什么你要切换到另一种列类型或删除自动增量(DatabaseGeneratedOption.None)并在需要时创建新的Guid。
这种形式的代码永远不会有效,因为EF不会将它的Id值传递给数据库(因为它生成了数据库),但是数据库不知道如何创建新的键值,因此它保留默认的Guid。
答案 4 :(得分:1)
DatabaseGenerated
表示它将由数据库生成。除非您为表中的列指定了默认值NEWID()
,否则永远不会获得新值。它始终是Guid.Empty
的值。要使您的应用程序正常工作,您可以执行以下两项操作之一。首先,您可以直接从代码中调用Guid.NewGuid()
并将值传递给Entity Framework。在这种情况下,没有必要将[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
作为Id
C#属性的一部分。另一个解决方案是更改表的列并将默认值添加为NEWID()
,在这种情况下,您不必担心自己生成此值,并且DatabaseGenerated
属性是有意义的。< / p>