Szukałem zasobów dotyczących sposobu deklarowania relacji klucza obcego i innych ograniczeń przy użyciu najpierw kodu EF 4.1 bez powodzenia. Zasadniczo buduję model danych w kodzie i używam MVC3 do zapytania tego modelu. Wszystko działa przez MVC, co jest świetne (brawa dla Microsoft!), Ale teraz chcę, aby NIE działało, ponieważ muszę mieć ograniczenia modelu danych.
Na przykład mam obiekt Order, który ma mnóstwo właściwości, które są obiektami zewnętrznymi (tabelami). W tej chwili mogę utworzyć zamówienie bez problemu, ale bez możliwości dodania klucza obcego lub obiektów zewnętrznych. MVC3 ustawia to bez problemu.
Zdaję sobie sprawę, że przed zapisaniem mógłbym po prostu dodać obiekty do klasy kontrolera, ale chciałbym, aby wywołanie DbContext.SaveChanges () zakończyło się niepowodzeniem, jeśli relacje ograniczeń nie zostały spełnione.
NOWA INFORMACJA
W szczególności chciałbym, aby wystąpił wyjątek, gdy próbuję zapisać obiekt Order bez określania obiektu klienta. Wydaje się, że nie jest to zachowanie, jeśli po prostu skomponuję obiekty zgodnie z opisem w większości dokumentacji Code First EF.
Najnowszy kod:
public class Order
{
public int Id { get; set; }
[ForeignKey( "Parent" )]
public Patient Patient { get; set; }
[ForeignKey("CertificationPeriod")]
public CertificationPeriod CertificationPeriod { get; set; }
[ForeignKey("Agency")]
public Agency Agency { get; set; }
[ForeignKey("Diagnosis")]
public Diagnosis PrimaryDiagnosis { get; set; }
[ForeignKey("OrderApprovalStatus")]
public OrderApprovalStatus ApprovalStatus { get; set; }
[ForeignKey("User")]
public User User { get; set; }
[ForeignKey("User")]
public User Submitter { get; set; }
public DateTime ApprovalDate { get; set; }
public DateTime SubmittedDate { get; set; }
public Boolean IsDeprecated { get; set; }
}
Oto błąd, który otrzymuję podczas uzyskiwania dostępu do widoku wygenerowanego przez VS dla pacjenta:
KOMUNIKAT O BŁĘDZIE
Atrybut ForeignKeyAttribute we właściwości „Patient” typu „PhysicianPortal.Models.Order” jest nieprawidłowy. Nie znaleziono nazwy klucza obcego „Parent” w typie zależnym „PhysicianPortal.Models.Order”. Wartość Nazwa powinna być listą oddzielonych przecinkami nazw właściwości kluczy obcych.
Pozdrowienia,
Guido
źródło
Możesz zdefiniować klucz obcy przez:
Teraz ParentId jest własnością klucza obcego i definiuje wymaganą relację między dzieckiem a istniejącym rodzicem. Uratowanie dziecka bez wychodzenia z rodzica spowoduje zgłoszenie wyjątku.
Jeśli nazwa właściwości FK nie składa się z nazwy właściwości nawigacji i nazwy nadrzędnej PK, musisz użyć adnotacji danych ForeignKeyAttribute lub interfejsu API Fluent, aby zmapować relację
Adnotacja danych:
Fluent API:
Inne typy ograniczeń mogą być wymuszane przez adnotacje danych i walidację modelu .
Edytować:
Otrzymasz wyjątek, jeśli nie ustawisz
ParentId
. Jest to właściwość wymagana (nie dopuszcza wartości null). Jeśli tego nie ustawisz, najprawdopodobniej spróbuje wysłać wartość domyślną do bazy danych. Wartość domyślna to 0, więc jeśli nie masz klienta o Id = 0, otrzymasz wyjątek.źródło