47

修改了整个帖子。

我正在尝试通过 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?我的 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 并删除 Data 注释。将 Id 重命名为 UserId,仍然遵循约定,并在其他 POCO 中进行必要的更改以与更改相匹配。

4

2 回答 2

56

这是一个猜测:)

是因为ID是一个字符串吗?如果将其更改为 int 会发生什么?

我是说:

 public int Id { get; set; }
于 2013-04-18T12:41:48.907 回答
8

你有一个糟糕的桌子设计。您不能自动增加字符串,这没有任何意义。你基本上有两个选择:

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

第一个选项需要更改引用此表的每个表,但这是值得的。

于 2013-04-18T12:57:03.823 回答