Überarbeitete gesamte Post.Wie Id mit Entity Framework zu generieren und zu inkrementieren
Ich versuche, die folgende JSON-POST-Anfrage über Fiddler zu schreiben:
{Username:"Bob", FirstName:"Foo", LastName:"Bar", Password:"123", Headline:"Tuna"}
Allerdings erhalte ich diese Fehlermeldung:
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
Obwohl, wenn ich manuell eine zufällige Id sendet zusammen mit Die Anfrage ist dann alles gut. Wie folgt:
{Id:"1", Username:"Bob", FirstName:"Foo", LastName:"Bar", Password:"123", Headline:"Tuna"}
Warum generiert Entity Framework die IDs nicht und erhöht sie automatisch? Meine POCO-Klasse ist wie folgt:
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; }
}
Hier ist die Controller-Methode. Wenn im Debug-Modus und ich die Anfrage über Fiddler senden bricht es bei db.SaveChanges();
und gibt den Fehler ein wenig über.
// 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);
}
}
Was ist los?
Lösung
Change string Id statt int und Daten Anmerkungen entfernen. Die Id in UserId umbenannt, immer noch der Konvention folgend, und bei Bedarf in anderen POCOs Änderungen vorgenommen, um den Änderungen zu entsprechen.
Wenn Sie Ihren Controller Schritt für Schritt debuggen, erhalten Sie einen Fehler bei db.SaveChanges()? Vielleicht ein Entitätsvalidierungsfehler? –