Paweł Łukasiewicz
2021-04-10
Paweł Łukasiewicz
2021-04-10
Udostępnij Udostępnij Kontakt
Wprowadzenie

Zagłębiamy się dalej w świecie domyślnych konwencji EF Core. Automatyczna konfiguracja relacji jeden do jednego jest nowością we frameworku - EF 6.x nie obsługiwał takiego podejścia.

Utworzenie takiej relacji wymaga referencyjnej właściwości nawigacyjnej po obu stronach. Tym razem model bazowy (przed wprowadzeniem zmian) prezentuje się w poniższy sposób:

public class Company
{
	public int CompanyId { get; set; }

	public string BrandName { get; set; }
}

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

	public string Address { get; set; }

	public string City { get; set; }
}
Założenie powyższego modelu jest proste. Dana firma ma główną siedzibę pod określonym adresem i żadna inna firma tutaj się nie znajduje. Wiem, podejście naiwne w dzisiejszych czasach - pamiętajcie jednak, że tematem przewodnim są relacje a nie poprawna architektura bazy danych. Realnym przykładem relacji jeden do jednego mógłby być paszport, który jest zawsze przypisany do konkretnej osoby.

Wprowadźmy zatem modyfikacje do wspominanych wcześniej klas:

public class Company
{
	public int CompanyId { get; set; }

	public string BrandName { get; set; }

    // referencyjna właściwość nawigacyjna
	public CompanyAddress Address { get; set; }	
}

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

	public string Address { get; set; }

	public string City { get; set; }

    // klucz obcy
	public int CompanyId { get; set; }

    // odpowiadająca referencyjna właściwość nawigacyjna
	public Company Company { get; set; }
}
W powyższym przykładzie encja Company zawiera referencyjną właściwość nawigacyjną typu CompanyAddress a encja CompanyAddress zawiera klucz obcy CompanyId oraz odpowiadającą mu właściwość referencyjną Company. Taka konstrukcja encji spowoduje utworzenie relacji jeden do jednego: EF Core: relacja jeden do jednego

EF Core utworzył również indeks unikalny na kolumnie klucza obcego CompanyId w tabeli Address. Indeks ten zapewnia, że wartość kolumny CompanyId będzie unikalna w orębie tabeli CompanyAddress co jest podstawowym wymaganiem w relacji jeden do jednego.

Podobnie jak w przypadku poprzedniego wpisu…jeżeli encje nie przestrzegają domyślnych konwencji możemy skorzystać z konfiguracji przy pomocy Fluent API.