Próbuję zaktualizować Customer
w mojej bazie danych przy użyciu interfejsu ASP.NET Web API i Entity Framework 5, ale to nie jest pracujący. Moje jednostki wyglądają tak:Najpierw kod EF5 z ASP.NET Web API: Zaktualizuj encję ze związkiem wiele-do-wielu
public class CustomerModel
{
public int Id { get; set; }
public string Name { get; set; }
// More fields
public ICollection<CustomerTypeModel> CustomerTypes { get; set; }
}
public class CustomerTypeModel
{
public int Id { get; set; }
public string Type { get; set; }
[JsonIgnore]
public ICollection<CustomerModel> Customers { get; set; }
}
Nic tak wyjątkowego. Zbudowałem interfejs internetowy, w którym użytkownicy mogą dodawać klientów, podając nazwę i sprawdzając jeden lub więcej typów klientów. Po uderzeniu w przycisk, dane są wysyłane do mojej internetowej metoda API:
public void Put([FromBody]CustomerModel customer)
{
using (var context = new MyContext())
{
context.Customers.Attach(customer);
context.Entry(customer).State = EntityState.Modified;
context.SaveChanges();
}
}
ten aktualizuje pola klientów, ale związane z nimi rodzaje klientów są ignorowane. Przychodzące customer
przedmiot ma zawierać listę CustomerTypes
powinno być związane z:
[0] => { Id: 1, Type: "Finance", Customers: Null },
[1] => { Id: 2, Type: "Insurance", Customers: Null }
[2] => { Id: 3, Type: "Electronics", Customers: Null }
Ale zamiast patrzenia na tej liście i dodawanie/usuwanie podmioty powiązane, EF prostu ignoruje go. Nowe skojarzenia są ignorowane, a istniejące powiązania pozostają, nawet jeśli powinny zostać usunięte.
Miałem podobny problem podczas wstawiania klienta do bazy danych, zostało to naprawione, gdy dostosowałem stan tych podmiotów do EntityState.Unchanged
. Oczywiście starałem się zastosować tę samą magiczną poprawkę w moim scenariuszu aktualizacja:
public void Put([FromBody]CustomerModel customer)
{
using (var context = new MyContext())
{
foreach (var customertype in customer.CustomerTypes)
{
context.Entry(customertype).State = EntityState.Unchanged;
}
context.Customers.Attach(customer);
context.Entry(customer).State = EntityState.Modified;
context.SaveChanges();
}
}
Ale EF ciągle wyświetla ten sam problem.
Wszelkie pomysły na rozwiązanie tego problemu? Czy naprawdę powinienem wyczyścić instrukcję ręcznie na liście CustomerTypes
, a następnie ręcznie je dodać?
Z góry dziękuję.
JP
Tak, bałem się tego podręcznika sposób robienia rzeczy. Dzięki za kod, zadziałało jak urok i uratowało mnie kilka prób zmagania się ze stanami :) –
Czy istnieje sposób na zrobienie tego generycznego, aby działał dla każdej własności nawigacji? – CodyK
@Codemiester: Możesz przyjrzeć się bibliotece GraphDiff wspomnianej w komentarzach tutaj: http://entityframework.codeplex.com/workitem/864 – Slauma