CodeGo.net>如何使用实体框架生成和自动增加Id

修改了整个帖子。

我正在尝试通过Fiddler发布以下JSON POST请求:

{Username:"Bob", FirstName:"Foo", LastName:"Bar", Password:"123", Headline:"Tuna"}

但是我收到此错误:

Message "Cannot insert the value NULL into column 'Id', table 'xxx_f8dc97e46f8b49c2b825439607e89b59.dbo.User'; column does not allow nulls. INSERT fails.\r\nThe statement has been terminated." string

虽然如果我随请求手动发送一个随机ID,那么一切都很好。 像这样:

{Id:"1", Username:"Bob", FirstName:"Foo", LastName:"Bar", Password:"123", Headline:"Tuna"}

为什么实体框架不生成ID并自动递增ID? 我的POCO课程如下:

public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public string Id { get; set; }
    public string Username { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Password { get; set; }
    public string Headline { get; set; }
    public virtual ICollection<Connection> Connections { get; set; }
    public virtual ICollection<Address> Addresses { get; set; }
    public virtual ICollection<Phonenumber> Phonenumbers { get; set; }
    public virtual ICollection<Email> Emails { get; set; }
    public virtual ICollection<Position> Positions { get; set; }
}

public class Connection
{
    public string ConnectionId { get; set; }
    public int UserId { get; set; }
    public virtual User User { get; set; }
}

public class Phonenumber
{
    public string Id { get; set; }
    public string Number { get; set; }
    public int Cycle { get; set; }
    public int UserId { get; set; }
    public User User { get; set; }
}

这是控制器方法。 在调试模式下,我通过Fiddler发送请求时,它在db.SaveChanges();处中断,并给出了上面所看到的错误。

    // POST api/xxx/create
    [ActionName("create")]
    public HttpResponseMessage PostUser(User user)
    {
        if (ModelState.IsValid)
        {
            db.Users.Add(user);
            db.SaveChanges();

            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, user);
            response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = user.Id }));
            return response;
        }
        else
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }
    }

怎么了?

将字符串ID改为int并删除数据注释。 仍遵循约定将ID重命名为UserId,并在必要时在其他POCO中进行了更改以与更改匹配。

brk asked 2020-08-10T17:12:51Z
2个解决方案
44 votes

这是一个猜测:)

是因为ID是字符串吗? 如果将其更改为int会怎样?

我的意思是:

 public int Id { get; set; }
tymtam answered 2020-08-10T17:13:07Z
8 votes

您的表格设计不好。 您不能自动增加字符串,这没有任何意义。 您基本上有两个选择:

1.)将ID的类型更改为int而不是字符串
2.)不推荐!!! -自己处理自动增量。 首先,您需要从数据库中获取最新值,将其解析为整数,将其递增,然后再次将其作为字符串附加到实体。 非常糟糕的想法

第一种选择是更改每个引用该表的表,但这是值得的。

walther answered 2020-08-10T17:13:41Z
translate from https://stackoverflow.com:/questions/16079217/how-to-generate-and-auto-increment-id-with-entity-framework