EntityFramework Core’da Value Objeler (Owned Type)

Identity gerektirmeyen objelere value objeler denir, bu tip objeler domain driven design içinde sıkça kullanılır. Bu gönderide aynı zamanda owned type olarak bilinen bu türlerin ef core’a nasıl uygulanacağına bakacağız.

Record Type

Record C# 9 ile gelen bir referans türüdür. En büyük avantajı immutability, referans ve value eşitliğidir. Bildiğiniz gibi class’larda bir karşılaştırma olduğu zaman bellekteki referanslara bakılarak yapılır, fakat record ile value’leri de karşılaştırılır.

  • Value Eşitliği
  • Basit syntax
  • Inherit için destek
  • Mutaion

Örnek bir tasarımına bakalım

Yazdığımız iki record da aynı anlama gelir birincisi syntax olarak daha basittir. Şimdi de eşitlik durumuna bakalım.

Görüldüğü gibi record karşılaştırma yaparken içindeki valueleri de karşılaştırırak yapar.

Objeyi with keywordüyle kolayca aktarabilirsiniz. (mutaion)

Inheritance

Entity Framework Core ile kullanımı

Örnek olarak bir User entity’miz ve bir de address bölümü olsun. Bu address bölümü her user’ın kendine ait spesifik bir alandır, yani birthDate, Name gibi alanlara denk gelir. Kompleks tipdir ve id’si yoktur. Ef core’da owned type olarak adlandırılır.
Mevcut tabloyla ilişki kurulabilmesi için owned type’lara bir gölge primary key yaratılır.

Address.cs

User.cs

ModelBuilder

Yukarıdaki durum için bir migration oluşturduğumuz zaman migration aşağıdaki gibi oluşacaktır.

Görüldüğü gibi owned type alanların columnları Address_Street, Address_Zipcode şeklinde oluştururken, City verdiğimiz isimle oluştu.

Owned Type’lar record tipinde yapmak zorunda değilsiniz, class ve struct gibi türlerde de yapabilirsiniz. Biz eşitlik karşılaştırması ve syntax’ı sebebiyle tercih ettik.

Ayrı bir tablo olarak saklama

Ayrıca owned type’larımızı farklı bir tablo oluşturp onda da saklayabiliriz. Fakat bu sadece veritabanı için bir değişikliktir, ef core’da yapı olarak birşey değişmeyecektir gene aynı yöntemi kullanacağız.

Migration:

Address columnu çekerken herhangi bir include yapmanıza gerek yok. Bu ilişiki 1’e 1 ilişkiye benzer olmasına rağmen sadece veritabanı şeması olarak benzerlikleri vardır.

Örnek bir query

Attribute olarak da işaretleyebiliriz.

Kısıtlamalar

  • DbSet<T> olarak çağıramazsınız
  • ModelBuilder içinde Entity<T> olarak çağıramazsınız.

Domain Driven Design’daki Rolü

Value objeler DDD’nin önemli bir parçasıdır. Domain modelleme yaparken ortak bir dil kullanırız (Ubiquitous Language), bu dil olabildiğince basit olmalı çünkü domain expert, developer gibi domain ile ilgili bütün bireylerin anlayacağı tarzda olmalı. Bu anlaşılabilirlik value objelerle daha da kolay olur örneğin Adres alanın çok fazla alanı olduğu varsayalım bu durumda tek tek User‘ın bir city, street gibi tanımlamalar yapacaktık. Halbuki bu durumda bir value obje tanımlamak sadece user değil kullanılacak tüm alanlar için bir tutarlılık ve kolaylık sağlayacaktır. Ayrıca gerçek dünya’daki kullanımına da çok yakın bir anlamı olacaktır.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Turkish