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.
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
Id | Name | Type |
1 | Murat ÖNER | 1 |
2 | Sakine ÖNER | 2 |
UserType Tablosu
Id | Name |
1 | Admin |
2 | User |
Ü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.
1 2 3 4 5 6 7 8 | public class User { public int Id { get; set; } public string Name { get; set; } public byte Type { get; set; } } |
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.
1 2 3 4 5 | public enum UserType : byte { Admin = 1, User } |
1 2 3 4 5 6 7 8 | public class User { public int Id { get; set; } public string Name { get; set; } public UserType Type { get; set; } } |
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;
1 2 3 | enum Issues : byte { //... } |
✍ 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.