Computed kolonların EntityFramework tarafından kullanımı, SqlServer’da kullandığımız computed türdeki kolonların EntityFramework tarafından kullanabilmek için Computed türde bir kolon olduğunu belirtmeniz gerekiyor yoksa bu tür alana insert update v.s. yapılamazken Computed kolon olduğunu bilemediğinden bu işlemi yapmaya çalışacak ve Exception fırlatılacaktır.
Çözüm Yolu
Peki bu Computed kolon tanımını EntityFramework içerisinde nasıl yapıyoruz. Eğer DbFirst kullanıyorsanız herhangi bir tanımlama yapmanıza gerek yok çünkü generator zaten bu tür tanımlamaları kendisi yapmaktadır sadece yeni kolon eklediyseniz Add/Update komutlarını edmx dosyası üzerinden gerçekleştirmelisiniz.
Ama CodeFirst bir yapınız mevcut ise o zaman Alttaki gibi fluent yada Attribute olarak ilgili özelliğin(kolonun) Computed olduğunu belirtmelisiniz.
Fluent olarak yapmanız gereken tanım şu şekide;
1 2 | modelBuilder.Entity<Salary>().Property(t => t.Total) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed) |
Attribute olarak yapmanız gereken tanım ise şu şekildedir.
1 2 | [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public double Total { get; private set; } |
Total özelliğinin Attribute yada fluent yapısı üzerinden nasıl Computed olarak işaretleneceğini bu örnek kodlarımız ile görmüş olduk artık bu kolonlara EntityFramework üzerinden insert yada update işlemi setter bloğunun erişim belirleyicinin private olarak işaretlenmesinden dolayı bilinçli olarak ve üstteki tanımlamalarımızdan dolayı EntityFramework tarafından Exception fırlatılacak bir işlem yapılamayacaktır.
Kaynaklar
- https://docs.microsoft.com/tr-tr/ef/core/modeling/relational/computed-columns
- https://stackoverflow.com/questions/15585330/calculated-column-in-ef-code-first
İşlemleri yapmama rağmen package manager da update database dediğimde
Cannot alter column ‘modelx’ because it is ‘COMPUTED’.
hatası alıyorum
Belki versiyon farklılığından v.s. sorun yaşıyor olabilirsiniz açıkçası hiçbir sorun yaşamadan çalışan örneğimi sizlerle paylaştım.