1

Ich habe Kunden- und Adressklassen, etwa wie folgt:ASP .NET Web API SaveChangesAsync mit Fremdschlüsseldaten

public class Customer 
{ 
    [PrimaryKey] 
    public int Id { get; set; } 
    public string CustomerName { get; set; } 
    public int ShippingAddressId { get; set; } 
    [ForeignKey("ShippingAddressId")] 
    public Address ShippingAddress { get; set; } 
} 
public class Address 
{ 
    [PrimaryKey] 
    public int Id { get; set; } 
    public string City { get; set; } 
} 

Wenn ich eine Web-API aufrufen, den Kunden zu aktualisieren, gebe ich ein bearbeitetes Customer-Objekt zu diesem Methode. Zum Beispiel bearbeiten I 2 Eigenschaften: Customer.CustomerName und Customer.ShippingAddress.City

AuthenticationResult ar = await new AuthHelper().AcquireTokenSilentAsync(); 
if (ar.Token == null) return false; 
using (var json = new StringContent(JsonConvert.SerializeObject(entity), UnicodeEncoding.UTF8, "application/json")) 
using (HttpClient client = new HttpClient()) 
{ 
    client.BaseAddress = new Uri(Settings.ApiUrl); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", ar.Token); 
    using (HttpResponseMessage response = await client.PutAsync("api/" + type.ToString() + "/" + id, json)) 
    { 
     response.EnsureSuccessStatusCode(); 
     return await InsertOrReplaceResponse(type, response); 
    } 
} 

Hier ist der Web-API:

[HttpPut("{id}")] 
public async Task<IActionResult> PutCustomer([FromRoute] int id, [FromBody] Customer customer) 
{ 
    _context.Entry(customer).State = EntityState.Modified; 

    await _context.SaveChangesAsync(); 

    return new StatusCodeResult(StatusCodes.Status204NoContent); 
} 

jedoch nur Customer.CustomerName aktualisiert wird. Die Fremdschlüsseldaten (Customer.ShippingAddress.City) werden nicht in der Adresstabelle aktualisiert.

Irgendeine Idee, was ich falsch mache?

Danke!

Antwort

0

Im Allgemeinen würde ich erwarten, dass die untergeordnete Entität Address ebenfalls aktualisiert wird, weil Sie die Fremdschlüsselzuordnung verwenden, die auch die Standardeinstellung für Eins-zu-eins-Zuordnungen sein sollte (weitere Details finden Sie unter here). Es scheint jedoch, dass etwas nicht richtig eingerichtet ist und Sie ein unabhängiges Assoziationsverhalten erhalten, bei dem Sie den Status der untergeordneten Entität selbst verwalten müssen. Sollte eine einfache Lösung in Ihrem Fall sein:

_context.Entry(customer).State = EntityState.Modified; 
_context.Entry(customer.ShippingAddress).State = EntityState.Modified; 
+0

Danke. Ich schwöre, ich habe es vorher versucht und es hat nicht funktioniert, aber jetzt tut es es. Ich musste zu der Zeit etwas anderes falsch in meinem Code haben. Vielen Dank! – Primico

+0

Ich bin neugierig auf eine Sache .. Was ist, wenn ich versuche, einen Kunden und eine Adresse zu aktualisieren, wo der Kunde bereits existiert und die Adresse nicht existiert. Ist es schlau genug, den Kunden zu aktualisieren und die neue Adresse einzugeben? – Primico

+0

@Primico müssen Sie den 'State' der' ShippingAddress' Entität auf 'EntityState.Added' setzen. EF wird eine Ausnahme auslösen, wenn es für eine neue Adresse "Modified" ist. Ich würde empfehlen, Adress-ID-Generierung in Ihrer API zu behandeln. Wenn die Adresse mit einer ID geliefert wurde, wird sie von der API aktualisiert. Wenn es ohne ID kam, wird die API versuchen, eine neue Adresse zu erstellen. –