2016-09-25 5 views
3

Я не могу создать новый идентификатор guid для моего первичного ключа. Получение такой же ошибки каждый раз, когда я пытаюсь создать другого пользователя, поскольку он не будет генерировать новый идентификатор guid.Entity Framework database-first + uniqueidentity result no new 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); 
} 

Как автоматически генерировать новые GUIDs?

+0

Как выглядит ваш код вида (формы)? – Shyju

ответ

1

Ваш код C# не генерирует никакого GUID, потому что вы поручаете ему это сделать. Ваша модель говорит, что значение Id генерируется базой данных (DatabaseGenerated(DatabaseGeneratedOption.Identity)) Проблема заключается в определении вашей таблицы в базе данных. Если вы используете сервер SQL, используя студию управления SQL сервера, просмотрите определение вашей таблицы и убедитесь, что идентификатор фактически определяется как «идентичность»

1

вы можете сделать в конструкторе класса, как этот

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

Что делать, если данный gui уже на столе? – 0014

1

Defining первичный ключ 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

Вашего ПК является GUID, я не знаю ни одной СУБД на самом деле, реализующей какие-то Autoincrement для столбцов GUID, так что не будет делать много смысл.

Именно поэтому у вас будет переход на другой тип столбца или сброс автоинкремента (DatabaseGeneratedOption.None) и создание нового Guid, когда вам это нужно.

Ваш код в этой форме никогда не будет работать, поскольку EF не передаст его значениям идентификатора в базу данных (поскольку она создана в базе данных), но база данных не знает, как создавать новые значения ключей, поэтому она сохраняет значение по умолчанию Guid.

1

DatabaseGenerated означает, что он будет создан по базе данных. Если вы не указали по умолчанию как NEWID() для своего столбца в своей таблице, вы никогда не получите новое значение. Это всегда будет значение Guid.Empty. Чтобы заставить приложение работать, вы можете сделать одну из двух вещей. Сначала вы можете позвонить Guid.NewGuid() прямо из вашего кода и передать значение Entity Framework. В этом случае нет смысла хранить [DatabaseGenerated(DatabaseGeneratedOption.Identity)] в качестве части вашего свойства Id C#. Другое решение - изменить столбец вашей таблицы и добавить значение по умолчанию NEWID(), и в этом случае вам не придется беспокоиться о создании этого значения самостоятельно, и ваш атрибут DatabaseGenerated имеет смысл.