2016-09-25 37 views
3

我无法为我的主键生成新的GUID ID。每次尝试创建另一个用户时都会收到相同的错误,因为它不会生成新的GUID ID。实体框架database-first + uniqueidentity结果没有新的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); 
} 

如何自动生成新的GUID?

+0

您的视图(表单)代码的外观如何? – Shyju

回答

1

您的c#代码不会生成任何GUID,因为您正在指示它这样做。您的模型表示Id的值由数据库生成(DatabaseGenerated(DatabaseGeneratedOption.Identity)) 问题出在数据库的表定义中。如果您正在使用SQL Server,使用SQL Server Management Studio中,查看您的表的定义,并确保ID实际上是定义为“身份”

1

,你可以在类的构造函数来完成这样的

public User() 
{ 
    this.Id= Guid.NewGuid(); 
} 
+0

如果给定的gui已经在桌面上了,该怎么办? – 0014

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); 
} 
1

你的PK是一个GUID,我不知道实际执行某种自动增量的GUID列的任何DBMS的,因为这不会太大感。

这就是为什么你需要切换到另一个列类型或删除自动增量(DatabaseGeneratedOption.None)并在需要时创建新的Guid。因为EF不会将Id值传递给数据库(因为它是数据库生成的),但数据库不知道如何创建新的键值,所以它保持默认值GUID。

1

DatabaseGenerated表示它将由数据库生成。除非您在表中为列指定了默认值NEWID(),否则您将永远不会获得新值。它将始终是Guid.Empty的值。为了让你的应用程序工作,你可以做两件事情之一。首先,您可以直接从您的代码中调用Guid.NewGuid()并将值传递给实体框架。在这种情况下,将[DatabaseGenerated(DatabaseGeneratedOption.Identity)]保留为Id C#属性的一部分没有意义。另一种解决方案是更改表格的列并将默认值添加为NEWID(),在这种情况下,您不必担心自己生成此值,并且您的DatabaseGenerated属性将有意义。