Revisionato post completo.Come generare e incrementare automaticamente Id con Entity Framework
Sto cercando di inviare la seguente richiesta JSON POST via Fiddler:
{Username:"Bob", FirstName:"Foo", LastName:"Bar", Password:"123", Headline:"Tuna"}
Comunque sto ottenendo questo errore:
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
Anche se inviare manualmente un ID casuale insieme la richiesta quindi è tutto ok Mi piace così:
{Id:"1", Username:"Bob", FirstName:"Foo", LastName:"Bar", Password:"123", Headline:"Tuna"}
Perché Entity Framework non genera e incrementa automaticamente l'ID? La mia classe POCO è la seguente:
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; }
}
Ecco il metodo del controller. Quando in modalità di debug e invio la richiesta tramite Fiddler, si interrompe a db.SaveChanges();
e dà l'errore visto un po 'sopra.
// 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);
}
}
Cosa c'è che non va?
Soluzione
Modifica stringa di identificazione a int invece e rimuovere le annotazioni di dati. Rinominato l'Id in UserId, sempre seguendo la convenzione, e apportato le modifiche, se necessario, in altri POCO per corrispondere alle modifiche.
Quando esegui il debug del controller, passo dopo passo, ricevi un errore su db.SaveChanges()? Forse un errore di validazione dell'entità? –