Comment générer et incrémenter automatiquement un identifiant avec Entity Framework

Poste entier révisé .

J’essaie de publier la requête JSON POST suivante via Fiddler:

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

Cependant, je reçois cette erreur:

 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." ssortingng 

Cependant, si j’envoie manuellement un ID aléatoire avec la demande, tout va bien. Ainsi:

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

Pourquoi Entity Framework ne génère-t-il pas et n’incrémente-t-il pas automatiquement les ID? Ma classe POCO est la suivante:

 public class User { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public ssortingng Id { get; set; } public ssortingng Username { get; set; } public ssortingng FirstName { get; set; } public ssortingng LastName { get; set; } public ssortingng Password { get; set; } public ssortingng Headline { get; set; } public virtual ICollection Connections { get; set; } public virtual ICollection
Addresses { get; set; } public virtual ICollection Phonenumbers { get; set; } public virtual ICollection Emails { get; set; } public virtual ICollection Positions { get; set; } } public class Connection { public ssortingng ConnectionId { get; set; } public int UserId { get; set; } public virtual User User { get; set; } } public class Phonenumber { public ssortingng Id { get; set; } public ssortingng Number { get; set; } public int Cycle { get; set; } public int UserId { get; set; } public User User { get; set; } }

Voici la méthode du contrôleur. Lorsque je suis en mode débogage et que j’envoie la requête via Fiddler, cela rompt à l’ db.SaveChanges(); et donne l’erreur vue un peu plus haut.

  // 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); } } 

Qu’est-ce qui ne va pas?

Solution

Modifiez plutôt ssortingng id en int et supprimez les annotations de données. A renommé l’ID en UserId, toujours conformément à la convention, et a apporté des modifications si nécessaire dans d’autres POCO pour correspondre aux modifications.

C’est une conjecture 🙂

Est-ce parce que l’ID est une chaîne? Que se passe-t-il si vous le changez en int?

Je veux dire:

  public int Id { get; set; } 

Vous avez un mauvais design de table. Vous ne pouvez pas auto-incrémenter une chaîne, cela n’a aucun sens. Vous avez essentiellement deux options:

1.) changer le type d’ID en int au lieu de ssortingng
2.) pas recommandé !!! – gérer l’auto-incrémentation par vous-même. Vous devez d’abord extraire la dernière valeur de la firebase database, l’parsingr dans l’entier, l’incrémenter et la relier à l’entité sous forme de chaîne. TRES MAUVAISE idée

La première option nécessite de changer chaque table qui a une référence à cette table, MAIS ça vaut le coup.

essayez de poster un json valide avec les chaînes citées:

 { "Username": "test", "FirstName": "foo", "LastName": "bar", "Password": "123", "Headline": "Tuna" }