Entity Framework relacja 1 do 1 z kluczem obcym

0

Poproszę zaprzecie lub potwierdźcie czy dobrze domyślam się, jeśli ma dwie tabele w tabeli A mam ustawiony PK, zaś w tabeli B chciałbym ustawić FK do tabeli A, to muszę to zrobić dla kolumny dla której ustawiam klucz, nie mogę tego zrobić w ten sposób:

public class MieszkanieStatus
{

      [Key]
      public int MieszkanieStatusId { get; set; }

      [ForeignKey("Mieszkanie")]
      public int MieszkanieId {get; set; }
      
      ...

      public Mieszkanie Mieszkanie {get; set}
}

czyli musiałbym skasować kolumnę MieszkanieStatusId, a jako klucz i klucz obcy zrobić MieszkanieId. Am I right?

Próbuję migrować to ustawienie ale wywala błąd o nie znalezieniu kolumny, zaś wszystkie tutorial-e nie piszą, że mogę dodać dodatkową kolumnę dla klucza obcego.
Wszystko działa poprawnie jeśli robię relację 1 do wielu. Mam nadzieję, że rozumiecie moje pytanie.

pozdrawiam

1

A nie tak to ma być ?

 
public class MieszkanieStatus
{
 
      [Key]
      [ForeignKey("Mieszkanie")]
      public int MieszkanieId {get; set; }
 
      ...
 
      public virtual Mieszkanie Mieszkanie {get; set}
}

public class Mieszkanie
{
	public int MieszkanieId {get; set;} 	
	public virtual MieszkanieStatus MieszkanieStatus {get; set}
}
0

Też tak myślę, że tak winno być, niemniej jednak chciałem niejako "rozdzielić" te klucze po osobnych kolumnach (nie wiem czy to poprawnie i zrozumiale napisałem), gdyż do klasy (tabeli) MieszkanieStatus (nie Mieszkanie tylko MieszkanieStatus) chciałem dodać tabelę ze zdjęciami i tu PK miał być MieszkanieStatusId i w tabeli ze zdjęciami klucz FK miał się odwoływać do niego i dalej relacja jeden to wielu.

Po "rozrysowaniu" tych relacji też winno działać.

Dzięki.

1

To co chcesz uzyskać nie ma sensu. Jak 1-1 to nie 1-n. Zastanów się czy to jest Ci do czegoś potrzebne to 1-1. Nie wiem co masz jeszcze w klasie StatusMieszkania.
Jak chcesz mieć 1-1 to ma być to ten sam PK. Zdjęcia mogą mieć FK do tego PK z MieszkaniaStatus (lub może lepiej do PK z Mieszkanie?), który jest w 1-1 z Mieszkanie.

1

Najlepiej to podziedzicz każdą encję przez klasę abstrakcyjną, która zawiera tylko

int Id {get;set;}

a we wszystkich encjach skasuj początkowe Id tabelek. No i tak jak wyżej piszą, jak chcesz mieć klucz obcy to tutaj wystarczy wpisać w encji encję xD

public class Mieszkanie : Abstrakcyjna encja
{
   public string ulica {get;set;}
   public virtual Wodociag woda {get;set;}
}

public class Wodociag : Abstrakcyjna encja
{
    public string kieszen {get;set;}
}

Po takim zabiegu każda tabelka ma swoje Id, więc nie trzeba w 20 tabelkach pisać gdjgId, gkjdkgId...

0
palcekj napisał(a):

To co chcesz uzyskać nie ma sensu. Jak 1-1 to nie 1-n. Zastanów się czy to jest Ci do czegoś potrzebne to 1-1. Nie wiem co masz jeszcze w klasie StatusMieszkania.
Jak chcesz mieć 1-1 to ma być to ten sam PK. Zdjęcia mogą mieć FK do tego PK z MieszkaniaStatus (lub może lepiej do PK z Mieszkanie?), który jest w 1-1 z Mieszkanie.

Wyjaśniam, programowanie traktuję hobbystycznie i wymyślam sobie zadania, tu wymyśliłem, że mam to zrobić w relacji 1:1 choćby nie wiem co, komercyjnie zapewnie zrobiłbym relację 1 do wielu, żeby ułatwić sobie zadanie. Mieszkanie to tabela z danymi mieszkania, mieszkanie status to wymyślona tylko jedna robota zaś zdjęcia to nie zdjęcia mieszkania a dowód wykonania tej roboty, czyli nie jako muszą odnosić się do tabeli Status. Ale dzięki.

0

No to w twoim przypadku może mieś sens zastosowanie 1-1. Zakładam, że mieszkanie może mies status (jakieś wykonywane prace) lub nie. Jednym z przypadków, gdy 1-1 może mieć zastosowanie to jest właśnie to, że część (spora) danych dla obiektu jest opcjonalna i może nie występować.

No i wtedy

public class MieszkanieStatus
{
 
      [Key]
      [ForeignKey("Mieszkanie")]
      public int MieszkanieId {get; set; }
 
      ...<image>foo</image>
 
      public virtual Mieszkanie Mieszkanie {get; set;}

    public virtual ICollection<Zdjecie> Zdjecia{get; set;}
}
 
public class Mieszkanie
{
    public int MieszkanieId {get; set;}     
    public virtual MieszkanieStatus MieszkanieStatus {get; set;}
}

public class Zdjecie
{

    public int Id {get; set;};
    public string FilePath{get; set;} // nie wiem jak chcesz przechowywać zdjęcia ale to nieważne
    public virtual MieszkanieStatus Status{get; set;}
}
 

Dostaniesz taki schemat jak w załączniku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1