Pertanyaan Cara menghasilkan dan Id kenaikan otomatis dengan Kerangka Entitas


Direvisi seluruh pos.

Saya mencoba mengirim permintaan JSON POST melalui Fiddler berikut ini:

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

Namun saya mendapatkan kesalahan ini:

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

Meskipun jika saya mengirim secara manual Id acak bersama dengan permintaan maka semuanya baik. Seperti ini:

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

Mengapa Entitas Kerangka tidak menghasilkan dan kenaikan otomatis Id itu? Kelas POCO saya adalah sebagai berikut:

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

Berikut ini metode pengontrol. Ketika dalam mode debug dan saya mengirim permintaan melalui Fiddler itu rusak db.SaveChanges(); dan memberikan kesalahan terlihat sedikit di atas.

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

Apa yang salah?

Larutan

Ubah string Id ke int dan hapus anotasi Data. Mengganti Nama menjadi UserId, masih mengikuti konvensi, dan membuat perubahan jika perlu di POCO lain untuk menyesuaikan dengan perubahan.


32
2018-04-18 09:27


asal


Jawaban:


Ini tebakan :)

Apakah karena ID adalah string? Apa yang terjadi jika Anda mengubahnya ke int?

Maksudku:

 public int Id { get; set; }

34
2018-04-18 12:41



Anda memiliki desain meja yang buruk. Anda tidak dapat mengikat string secara otomatis, itu tidak masuk akal. Pada dasarnya Anda memiliki dua pilihan:

1.) ubah jenis ID menjadi int bukannya string
2.) tidak direkomendasikan !!! - Tangani autoincrement sendiri. Anda harus terlebih dahulu mendapatkan nilai terbaru dari database, parse ke integer, increment dan lampirkan ke entitas sebagai string lagi. Gagasan SANGAT BURUK

Opsi pertama mengharuskan untuk mengubah setiap tabel yang memiliki referensi ke tabel ini, TAPI it's worth it.


7
2018-04-18 12:57



coba posting json yang valid dengan string kutipan:

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

-3
2018-04-18 10:47