2015-02-18 9 views
7

Mam tabelę UserForms, która ma dwa klucze obce do tabeli krajów, ale podczas tworzenia kontrolera i tworzenia widoku (dla modelu UserForms) dwa pola łączą się z obcymi klawisze się nie pojawiają. Co powinienem zrobić, aby rozwiązać ten problem? Poniżej znajdują się dwa modele:EF 6 jak ustawić dwa klucze obce do tej samej tabeli

public class UserForms 
{ 
    public int Id { get; set; } 

    public string FullNames { get; set; } 
    public Countries IndividualsCountry { get; set; } 
    public Countries BusinessCountry { get; set; } 
} 

public class Countries 
{ 
    public Countries() 
    { 
     this.STRBusinessCountry = new HashSet<UserForms>(); 
     this.STRIndividualsCountry = new HashSet<UserForms>(); 
    } 

    public int Id { get; set; } 
    public string NameOfCountry { get; set; } 

    [InverseProperty("IndividualsCountry")] 
    public virtual ICollection<UserForm> STRIndividualsCountry { get; set; } 
    [InverseProperty("BusinessCountry")] 
    public virtual ICollection<UserForm> STRBusinessCountry { get; set; } 
} 
+3

Nie powinieneś używać nazw twoich encji. 'Kraj' i' UserForm' będzie czytelny – dotctor

+0

@doctor dzięki za wgląd .. przykład do skierowania mnie do rozwiązania jest bardzo doceniany –

+1

Możesz dodać klucze jawnie: 'public int CountryId1 {get; set;}' z '[ForeignKey (" CountryId1 ")]' na twoich właściwościach nawigacji – TGlatzer

Odpowiedz

8

Komentarz pozostawiony przez @ T.Glatzer jest poprawny. należy narażać obcych kluczowych właściwości na swoich podmiotów zależnych:

public class UserForms 
{ 
    public int Id { get; set; } 

    public string FullNames { get; set; } 

    public int IndividualsCountryId { get; set; } 
    [ForeignKey("IndividualsCountryId")] 
    public virtual Countries IndividualsCountry { get; set; } 

    public int BusinessCountryId { get; set; } 
    [ForeignKey("BusinessCountryId")] 
    public virtual Countries BusinessCountry { get; set; } 
} 

Tutaj użyłem int, ale jeśli któryś z tych właściwości nawigacyjnych są opcjonalne, byś po prostu zastąpić int? lub System.Nullable<int> zamiast (który stworzy kolumnę int NULL w baza danych zamiast int NOT NULL).

Chociaż funkcja EF nie wymaga wyświetlania właściwości nawigacyjnych, dobrym pomysłem jest zazwyczaj. Zaufaj mi. Pomoże Ci uniknąć nieoczekiwanych wyjątków w przyszłości. W rzeczywistości, niektóre komunikaty o wyjątkach EF faktycznie zalecają ekspozycję właściwości klucza obcego na klasach jednostek, aby pomóc EF lepiej wymyślić sposób mapowania relacji. Oto przykład jednego z takich wyjątków. Uwaga sekcję "Informacje dodatkowe":

{ "Instrukcja INSERT konflikt z ograniczeniem FOREIGN KEY "FK_dbo.DependentTable_dbo.PrincipalTable_Id". Konflikt wystąpiło w bazie danych "NazwaBazyDanych", tabela "dbo.PrincipalTable" column "Identyfikator". Instrukcja została zakończona. "}

Dodatkowe informacje: Wystąpił błąd podczas zapisywania jednostek, które nie ujawniają właściwości klucza obcego dla ich relacji. Właściwość EntityEntries zwróci wartość null, ponieważ pojedyncza jednostka nie może być identyfikowana jako źródło wyjątku jako . Obsługa wyjątków podczas zapisywania można ułatwić, eksponując właściwości klucza obcego w typach jednostek. Zobacz szczegóły wyjątku InnerException.

+0

dziękuję, że twoje rozwiązanie zadziałało –

+0

Naprawdę napisałeś to ładnie - weź moje kudo :) – TGlatzer

3

@danludwig dziękuję za wyjaśnienie @ T.Glatzer odpowiedź, która zadziałała dla mnie! Dziękuję Ci. mój ostatni kod, który teraz działa, to:

public class UserForms 
    { 
     public int Id { get; set; } 

     public string FullNames { get; set; } 
    [ForeignKey("IndividualsCountry")] 
     public int? IndividualsCountryId { get; set; } 
    [ForeignKey("BusinessCountry")] 
     public int? BusinessCountryId { get; set; } 

     public virtual Countries IndividualsCountry { get; set; } 
    public virtual Countries BusinessCountry { get; set; } 
    } 

public class Countries 
    { 
     public Countries() 
     { 
      this.STRBusinessCountry = new HashSet<UserForms>(); 
      this.STRIndividualsCountry = new HashSet<UserForms>(); 
     } 

     public int Id { get; set; } 
     public string NameOfCountry { get; set; } 

     [InverseProperty("IndividualsCountry")] 
     public virtual ICollection<UserForms> STRIndividualsCountry { get; set; } 
     [InverseProperty("BusinessCountry")] 
     public virtual ICollection<UserForms> STRBusinessCountry { get; set; } 
    } 
Powiązane problemy