Entityframework’de Enum Kullanımı

Entityframework’un benim için en güzel özelliklerinden biri sayısal bir değerin enum değeri ile eşleştirilip bana enum türünde veriyor olmasıdır.  Veritabanında sayısal olan alanlar için C# tarafında ilgili sınıfın özelliğinin tiplerine enum olarak ürettiğiniz nesneyi verirseniz EntityFramework Convert işlemini sayısal işlemden Enum’a kendisi yapacaktır.

Entityframework’de Enum Kullanımı

Entityframework’un benim için en güzel özelliklerinden biri sayısal bir değerin enum değeri ile eşleştirilip bana enum türünde veriyor olmasıdır.  Veritabanında sayısal olan alanlar için C# tarafında ilgili sınıfın özelliğinin tiplerine enum olarak ürettiğiniz nesneyi verirseniz EntityFramework Convert işlemini sayısal işlemden Enum’a kendisi yapacaktır örnek olarak alttaki gibi bir User ve Type kolonu ile ilişkili UserType  tablomuz olduğunu varsayalım.

lVZKfmul4kcAAAAASUVORK5CYII=

Type kullanıcı türünü sayısal olarak tabloda tutan bir alandır ve bu alana geçilen değerlerin karşılıklarının UserType adlı tablodaki kayıtlara denk geldiğini düşünelim.

Normalde CodeFirst ve DbFirst ile EntityFramework kullanan kişilerin C# tarafında Type kolonları için tinyint ise byte int ise int gibi direkt sayısal alan tipi kullanımlarını görüyoruz fakat hem okunabilirlik hemde kod kalitesi açısından Enum’lar ile çalışmak daha sağlıklı olacaktır.

User ve UserType tablosunda alttaki gibi kayıtlarımız olduğunu varsayalım.

User Tablosu

IdNameType
1Murat ÖNER1
2Sakine ÖNER2

UserType Tablosu

IdName
1Admin
2User

Üstteki tablolarda görüldüğü üzere Murat ÖNER ve Sakine ÖNER adında 2 kullanıcımız var ve Murat ÖNER 1 UserType’ına yani Admin UserType’ına sahip Sakine ÖNER’in ise User olduğunu görüyoruz. Bu durumda benim User tablosu için EntityFramework tarafında alttaki gibi bir Entity sınıfım varsa o zaman entity sorgusundan bana direkt olarak 1 ve 2 diye int değer dönecek.

Tabloyu oluşturduğunuz aşamada geliştirme işlemini yapıyorsanız 1’e Admin ve 2’ye User kullanıcı türünün karşılık geldiğini o an bilebilirsiniz ama aradan belli bir süre geçtikten sonra tekrar aynı kod bloklarınıza döndüğünüzde kod blokları arasında if(user.Type == 1) gibi v.b. kod blokları ile karşılaştığınız 1 neydi demeniz yüksek derecede olası bir durumdur işte bu durumun önüne geçmek için alttaki gibi bir UserType adında bir Enum oluşturuyorum ve User sınıfının Type özelliğine byte yerine UserType Enum’ını veriyorum.

Gördüğünüz gibi UserType adlı enum’ı byte tipinden kalıtım alarak oluşturduk enum’ların varsayılan olarak kalıtım aldıkları sayısal tip int tipidir o yüzden tablodaki alan tipinize göre bu kısmı düzeltmelisiniz. Enum oluşturma sonrası User tablosundaki Type alanına UserType enum’ını özellik tipi olarak geçtim böylelikle if(user.Type == 1) yerine if(user.Type == UserType.Admin) şeklinde okunabilir kodlar yazabileceğim.

Karşılaşabileceğiniz Hatalar

Hata

System.InvalidOperationException : The ‘State’ property on ‘Issue’ could not be set to a ‘System.Byte’ value. You must set this property to a non-null value of type ‘IssueState’.

Bu hatayı dikkatsizlikten dolayı aldım ama hatayı aldıktan sonra sıkıntının enum türünün varsayılan olarak int türünden türediğini ve veritabanından tinyint yani byte türünden geldiğini bilince çözümün enum’u byte’dan türeyecek şeklinde değiştirince sorunun çözüldüğünü gördüm.

SqlServer’daki tinyint türünün C# karşılığı byte türüdür. SqlServer ve C# türü karşılıklarını öğrenmek için SQL SERVER <-> C# TÜRÜ KARŞILIKLARI sayfasına gözatabilirsiniz.

Sorunu gidermek için yapacağınız şey enum’unuza veritabanında kullandığınız türe karşılık gelen C# türünü yazmak. Benim sorunun çözümü için tinyint’e C#’da karşılık gelen byte türünden türeyecek şekilde ayarladıktan sonra bitiyor. Son halide şu şekilde;


✍ Lütfen olumlu-olumsuz tüm görüşlerinizi bana yorum yada mail yolu ile iletmeyi ihmal etmeyin.

🔗 Sosyal medya kanallarından makaleyi paylaşarak destek olursanız çok sevinirim.

👋 Bir sonraki makalede görüşmek dileğiyle.

4.6/5 - (9 votes)

Murat Öner sitesinden daha fazla şey keşfedin

Okumaya devam etmek ve tüm arşive erişim kazanmak için hemen abone olun.

Okumaya devam et