2015-09-29 10 views
18

Dlaczego jednostka nie może mieć ograniczeń jednoznaczności z jedną obowiązkową relacją odwrotną? Posiadające dwie jednostki:Dlaczego jednostka nie może mieć ograniczeń jednoznaczności z jedną obowiązkową relacją odwrotną?

  • osoby

właściwość: Nazwa

zależność: dział (do jednego, bez opcjonalnego)

  • Department

własność: tytuł (uniqu e ograniczenie)

relacji: człowiek (do-wielu, opcja)

model nie będzie kompilować w iOS 9, XCode 7.0.1 ze złej konfiguracji błędu jednostki:

Misconfigured Entity: Entity Department cannot have uniqueness constraints and to-one mandatory inverse relationship Person.department

Aktualizacja: Pytanie jest nadal aktualne w XCode 8.3.1.

+0

Wydaje się być błędem w XCode 7.0.1 - 8.3.1. Zrobi radar później. –

Odpowiedz

1

Krótka odpowiedź:

Podstawowym problemem jest najprawdopodobniej spowodowane przez sqlite standardzie. Nie jestem co do tego pewien. Jakkolwiek, jest bardzo prawdopodobne, że jest to spowodowane ograniczeniami sqlite. Znalazłem kilka postów w Internecie, gdzie ludzie mieli problemy z wieloma ograniczeniami na jednym stole i to właśnie jest powód, dla którego działa obejście dwóch tabel.

Długa odpowiedź:

Jest to dość późno, ale mam nadzieję, że to pomaga w każdym razie.

Dzieje się tak, gdy twój podmiot ma unikalne ograniczenie i relację obowiązkową. Przypuszczam, że wynika to z dodanych wyjątkowych zachowań ograniczających w systemie iOS 9.0. Można to jednak rozwiązać na dwa sposoby:

Usuwasz ograniczenie unikalne lub relację opcjonalną. Możesz obsłużyć opcjonalną relację w kodzie. Ale nie będzie to miłe rozwiązanie.

LUB

Można użyć obejścia. Możesz mieć jedno i drugie. Możesz utworzyć super klasę o unikalnym ograniczeniu. Jednak nie będzie to działało bez problemów.

Załóżmy, że masz trzy byty. A, B i C.

A to twoja super klasa, a B to klasa podrzędna A i C to też podklasa A. A ma unikalne ograniczenie na własność primaryKey. Podczas zapisywania wystąpień B i C, nie możesz mieć B i C z tym samym kluczem podstawowym. Ponieważ CoreData będzie zarządzać zarówno jako A.

Można zmienić mieć dwie właściwości:

  • int: originalPrimaryKey (NO UNIQUE)
  • ciąg: primaryKey (UNIQUE)

Teraz można mapować primaryKeys do originalPrimaryKey i podczas ustawiania originalPrimaryKey można ustawić właściwość ciąg primaryKey na CLASS_NAME. {originalPrimaryKey}. To pozwoliłoby ci zachować takie zachowanie, jakiego byś się spodziewał. Ale musisz dodać obejście dla kluczy primaryKeys.

+0

Obsługa relacji opcjonalnych to znacznie mniej wysiłku niż niechciana podklasowanie. Dziękuję za obejścia, ale powód jest nieujawniony - po prostu sparafrazowałeś moje dane wejściowe, więc nie mogę zaakceptować tego jako odpowiedzi. –

+0

Podstawowy problem jest najprawdopodobniej spowodowany standardem sqlite. Nie jestem tego pewien, więc o tym nie wspomniałem. Jakkolwiek, jest bardzo prawdopodobne, że jest to spowodowane ograniczeniami sqlite. Znalazłem kilka postów w Internecie, gdzie ludzie mieli problemy z wieloma ograniczeniami na jednym stole i to właśnie jest powód, dla którego działa obejście dwóch tabel. – Maik639

+0

Dzięki. Dodałem Twój komentarz w odpowiedzi dla innych, aby było łatwiej. –

-4

Utwórz właściwości relacji "opcjonalne". To naprawiło ten problem w moim przypadku.

+3

Pytanie dotyczy wyraźnie ** obowiązkowej ** relacji. Wiem, że działa z opcjonalnym, ale nie ma wtedy walidacji. –

+0

Ale dlaczego to działa? Ktokolwiek wie? –

Powiązane problemy