2015-10-02 12 views
15

Mam dwie tabele:Entity Framework 6 opcjonalnie jeden sposób relacja

Client 
------------------------ 
Id   (string) <-- PrimaryKey 
Name   (string) 
Number  (int) 

Department:* 
------------------------ 
Id   (int) <-- Primary key 
Name   (string) 
ClientNumber (int?) 
Client  (Client, virtual) 
..... 

Teraz chcę utworzyć opcjonalny relacji z Departmant do klienta (przy użyciu ClientNumber). Stworzyłem wirtualną właściwość w klasie Department (Client) i teraz muszę skonfigurować relację za pomocą EntityTypeConfiguration.

Istnieje brak kluczy obcych skonfigurowanych w bazie danych i nie jestem w stanie zmienić bazy danych. Nie mogę zmienić klienta Entity (klasy).

Muszę więc powiedzieć EntityFramework, że ClientNumber w klasie Department jest powiązany (opcjonalnie) z właściwością Number w klasie Client.

Ale nie mogę dowiedzieć się, jak powiedzieć, że EF Departamentu ClientNumber wiąże się z Klienta Ilość własności, a nie klucza podstawowego Klienta. (bez zmiany klasy podmiotu klienta)

edycja: Numer własność na kliencie jest unikalna dla każdego wpisu.

Relacja powinna skutkować sql jak ten:

SELECT ..... 
FROM Department D LEFT OUTER JOIN Client C ON (D.ClientNumber = C.Number) 

Łatwo jest to zrobić za pomocą łączy w Linq, ale byłoby wspaniale, po prostu:

dbContext.Departments.Include(d => d.Client) 

użyciu wirtualny właściwość w klasie departamentu zawierającej klienta (jeśli istnieje)

+1

Nie można również tworzyć relacji w strukturze encji bez użycia kolumn klucza głównego. Jeśli chcesz zrealizować tę relację, musisz uwzględnić kolumnę Id klienta jako kolumnę klucza obcego. Jeśli to z jakiegoś powodu nie jest pożądane, możesz utworzyć widok, aby modelować tę relację. –

Odpowiedz

0

Niestety nie jest to możliwe. Relacja walidacyjna w EF musi być również poprawna w bazie danych, innymi słowy tabela zależna musi odwoływać się do unikalnego identyfikatora w tabeli głównej. W przeciwnym razie system nie może zagwarantować, że w jednym dziale jest najwyżej jeden klient.

+2

To nie do końca prawda. Relacja powinna odnosić się do właściwości, którą EF * zna * jako klucz podstawowy. Może to być 'Client.Number', ale ta właściwość powinna zostać zdefiniowana jako klucz podstawowy w modelu. EF 7 będzie obsługiwał alternatywne klucze. –

0

Jako obejście, będzie można dodać zarówno ClientID i mienia ClientNumber? Można uzyskać dostęp do ClientNumber z właściwości klienta wirtualnego po upewnieniu się, że klient nie ma wartości null:

public class Client 
    { 
     public string Id { get; set; } 
     public string Name { get; set; } 
     public int Number { get; set; } 
    } 

    public class Department 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string ClientId { get; set; } 

     public virtual Client Client { get; set; } 

     [NotMapped] 
     public int? ClientNumber { 
      get { 
       return Client != null ? Client.Number : null; 
      } 
     } 
    } 
Powiązane problemy