WebAPI, Asp.Net Core 2.1, POST i złożone typy danych

0

Próbuję zrobić aplikację opartą na WebAPI. Stanąłem przed następującym problemem: przy dodawaniu do bazy metodą POST danych z formularza zawierającego element dropdown wypełniany na podstawie danych z bazy jeśli wysyłam w JSONie podobiekt z polem 'id' obiektu ToolTypes:
{"name":"piła","rentalPrice":10,"toolType":{"id":1,"type":"ręczne"},"toolTypeId":1,"barcode":"2"}
to baza protestuje że nie mogę tego robić jawnie: "SqlException: Cannot insert explicit value for identity column in table 'ToolTypes' when IDENTITY_INSERT is set to OFF."

W bazie mam już ToolType {"id":1,"type":"ręczne"}.

Jeśli wysyłam JSONa bez 'id' obiektu ToolTypes, to dodaje również nowy podobiekt z nowym ID, na przykład:

wysyłam: {"name":"piła","rentalPrice":10,"toolType":{"type":"ręczne"},"toolTypeId":1,"barcode":"2"}
tworzony jest obiekt w ten sposób: {"id":5,"name":"piła","rentalPrice":10.0,"toolType":{"id":7,"type":"ręczne"},"toolTypeId":7,"barcode":"2"}

Celem jest utworzenie takiego nowego obiektu:
{"id":5,"name":"piła","rentalPrice":10.0,"toolType":{"id":1,"type":"ręczne"},"toolTypeId":1,"barcode":"2"}

Jak to zrobić poprawnie?

Obiekt Tool mam zdefiniowany tak:

public class Tool
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Required]
        public string Name { get; set; }

        [Required]
        [DataType(DataType.Currency)]
        [Column(TypeName = "decimal(10, 2)")]
        public decimal RentalPrice { get; set; }

        [Required]
        public ToolType ToolType { get; set; }
        public int ToolTypeId { get; set; }

        [Required]
        public string Barcode { get; set; }
    }

natomiast obiekt ToolType tak:

 public class ToolType
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        [Required]
        public string Type { get; set; }
    }
2

Jak miałem tego typu problemy to robiłem tak: przy dodawaniu Tool przypisuj tylko ToolTypeId a ToolType niech będzie nullem. EF to ogarnie. Lub pobierz obiekt toolType o podanym Id z bazy i przypisz do toola. Masz w ogóle jakiś mapowanie po drodze np ToolDto na Tool ? czy to co dostajesz postem od razu idzie na bazę ?

0
szydlak napisał(a):

Jak miałem tego typu problemy to robiłem tak: przy dodawaniu Tool przypisuj tylko ToolTypeId a ToolType niech będzie nullem. EF to ogarnie. Lub pobierz obiekt toolType o podanym Id z bazy i przypisz do toola. Masz w ogóle jakiś mapowanie po drodze np ToolDto na Tool ? czy to co dostajesz postem od razu idzie na bazę ?

{"name":"piła","rentalPrice":10,"toolType":null,"toolTypeId":1,"barcode":"2"} -> {"toolType.id":["Error converting value {null} to type 'System.Int32'. Path 'toolType.id', line 1, position 53."]}
{"name":"piła","rentalPrice":10,"toolType":{"id":null,"type":null},"toolTypeId":1,"barcode":"2"} -> {"toolType.id":["Error converting value {null} to type 'System.Int32'. Path 'toolType.id', line 1, position 53."]}

Z [Required] dla tego pola nie chce rezygnować, bo lubię mieć integralność zapewnioną na poziomie bazy.
Leci od razu do bazy. Rozumiem, że muszę się zaprzyjaźnić z DTO?

0
szydlak napisał(a):

Jak miałem tego typu problemy to robiłem tak: przy dodawaniu Tool przypisuj tylko ToolTypeId a ToolType niech będzie nullem. EF to ogarnie. Lub pobierz obiekt toolType o podanym Id z bazy i przypisz do toola. Masz w ogóle jakiś mapowanie po drodze np ToolDto na Tool ? czy to co dostajesz postem od razu idzie na bazę ?

Wywalenie [Required] pomogło (przynajmniej na poziomie Postmana).
Teraz jeszcze na poziomie AJAXa to muszę jakoś zrealizować.

2

Leci od razu do bazy. Rozumiem, że muszę się zaprzyjaźnić z DTO?

No to lepiej zrób sobie jakiś obiekt np ToolDto , który jest parametrem akcji POST. A potem to mapuj na encje.
Niektóre praktyki możesz podejrzeć tu: https://piotrgankiewicz.com/c[...]ecoming-a-software-developer/

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0