Jak pobrać nowe jednostki (EntityState.New) z serwera za pomocą breezejs
Mam usługi sieciowe, które zwracają niektóre dane, które są następnie przekształcane w nowe elementy na serwerze, a następnie przekazywane klientowi, gdzie użytkownik może je edytować. Jeśli zdecyduje sięSaveChanges
, podmioty powinny być przesłane do serwera i wstawione do bazy danych. Mam dwa problemy:
EntityState.New
Breeze oczekuje, że niezmienione elementy mają zestaw kluczy podstawowych. Ponieważ żaden ze zwróconych nowych elementów nie ma zestawu kluczy (wartość klucza typu Int32 równa się 0), Breeze uważa, że serwer zwrócił wiele instancji tego samego obiektuAby zademonstrować problem, zmieńToDosController.ToDos
metoda w przykładzie AngularJS, aby pasowała do następujących:
[HttpGet]
public IEnumerable<TodoItem> Todos()
{
return new TodoItem[]
{
// Keys are not set because (equals to 0) these are new entities
new TodoItem() { Description="First item"},
new TodoItem() { Description="Second item"},
};
}
Po uruchomieniu próbki strona HTML pokaże dwie linie, obie będą miały opis „Drugi element”. Jeśli jawnie ustawię identyfikatory tych elementów na serwerze (których nie chcę robić, ponieważ klucze są generowane przez bazę danych), problem nie jest widoczny.
Pytanie: jak poprawnie zwracać elementy z serwera, aby były oznaczone jakoEntityState.New
i zostaną zapisane w bazie danych (z wygenerowanymi kluczami), kiedySaveChanges
jest nazywany.
Spodziewałbym się trochęMergeStrategy
na kliencie lub dodatkowe dane / atrybuty na serwerze, aby to osiągnąć, ale nie udało się go znaleźć.
AKTUALIZACJA:
W celu wyjaśnienia:
Próbuję obsługiwać scenariusz, w którym użytkownicy wybierają i edytują jeden z elementów pochodzących z innego źródła, które powinny zostać później dodane do mojej bazy danych.
W szczegółach:
Klient wywołuje serwer z kryteriami wyszukiwania jako parametrami metody. Zwraca metodę serweraIEnumerable<Customer>
- to robinie powrótIQueriable<Customer>
Serwer wysyła zapytanie do usługi internetowej zaplecza (systemu CRM) i przekształca wynik usługi internetowej zaplecza wCustomer
podmioty. Wynik jest zwracany klientowi. Usługa sieciowa zaplecza nie jest dostępna dla klienta.
Klient wyświetla wynik użytkownikowi
Użytkownik wybiera jedną z jednostek i edytuje jej właściwości (takie jak zmiana nazwy lub adresu klienta)
Wybrany klient zostanie dodany do menedżera encji na kliencie. Powinien być wEntityState.Added
em.SaveChanges
jest wywoływany, który przesyłaAdd
ed na serwerze
Serwer wstawia nowego klienta do bazy danych, baza danych generuje nowy klucz podstawowy, który jest zwracany do klienta, gdzie EM aktualizuje klucz jednostki i ustawia stan jednostki naEntityState.Unchanged
Może potrzebuję osobnych jednostek i właściwym pytaniem jest:„Jak zwrócić elementy do klienta bez dodawania ich do menedżera encji?” (zostaną dodane w kroku 5 powyżej).
P.S: Jednym z rozwiązań byłoby użycie niestandardowego typu danych innych niż jednostka (takiego jak CustomerFromCRM) w wyniku mojej metody serwera. Następnie przekształciłbym je w klienta po stronie klienta. Ale chciałbym uniknąć tworzenia dodatkowych klas.
UPDATE2: Znalazłem podobne pytanie (bez zaakceptowanych odpowiedzi) tutaj:czy istnieje łatwy sposób oznaczenia elementu w pamięci podręcznej jako „dodanego”?