2016-09-25 66 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屬性將有意義。