brk*_*brk 43 c# json entity-framework asp.net-web-api
修改了整个帖子.
我正试图通过Fiddler发布以下JSON POST请求:
{Username:"Bob", FirstName:"Foo", LastName:"Bar", Password:"123", Headline:"Tuna"}
Run Code Online (Sandbox Code Playgroud)
但是我收到了这个错误:
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
Run Code Online (Sandbox Code Playgroud)
虽然如果我手动发送随机ID和请求,那么一切都很好.像这样:
{Id:"1", Username:"Bob", FirstName:"Foo", LastName:"Bar", Password:"123", Headline:"Tuna"}
Run Code Online (Sandbox Code Playgroud)
为什么实体框架不会生成并自动增加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; }
}
Run Code Online (Sandbox Code Playgroud)
这是控制器方法.当处于调试模式并且我通过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);
}
}
Run Code Online (Sandbox Code Playgroud)
怎么了?
解
将字符串Id更改为int,然后删除Data annotations.将Id重命名为UserId,仍遵循惯例,并在必要时在其他POCO中进行更改以匹配更改.
tym*_*tam 46
这是猜:)
是因为ID是一个字符串吗?如果将其更改为int会发生什么?
我的意思是:
public int Id { get; set; }
Run Code Online (Sandbox Code Playgroud)
你有一个糟糕的桌面设计.你不能自动增加一个字符串,这没有任何意义.你基本上有两个选择:
1.)改变ID的类型int
而不是字符串
2.)不推荐!!! - 自己处理自动增量.首先需要从数据库中获取最新值,将其解析为整数,然后将其递增并再次将其作为字符串附加到实体.很糟糕的主意
第一个选项需要更改每个引用此表的表,但这是值得的.