实体框架数据库 - 首先+ uniqueidentity结果没有新的guid id

时间:2016-09-25 00:54:30

标签: asp.net-mvc entity-framework

我无法为主键生成新的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);
}

如何自动生成新指南?

5 个答案:

答案 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>