Hasan Akpürüm
Kıdemli Yazılım Danışmanı
Makele Detayı

Entity Framework Core AutoHistory

9/26/2018 11:46:30 AM

Merhaba Arkadaşlar,

Bu makalemde sizlere Ef Core AutoHistory kullanımı anlatmaya çalışacağım. Sizler tablolarınızın üzerindeki yapılan değişiklikleri aynı tablonun history sini açıp oraya insert ederek tutuyor olabilirsiniz ya da farklı senaryolar ile tutuyor olabilirsiniz bu da size ayrı bir iş yükü getirir. Ef core ile beraber bu işlem oldukta basit hızlı bir şekilde gerçekleşiyor. Tablo üzerinde yapılan değişiklikler değişikliğe göre kolon bazlı ya da tüm kolonlar dahil olmak üzere geçmişini tutabiliyorsunuz.  Microsoft.EntityFrameworkCore.AutoHistorykütüphanesi sayesinde tablolarımızdaki değişiklikleri otomatik olarak tutacağız. Kütüphanenin kısaca çalışma mantığından bahsedecek olursak DbContext üzerindeki değişiklikleri yakalar ve eğer veri güncelleniyorsa  güncellediğiniz kolonları verileri ile beraber önceki hali ve sonraki hali şeklinde Json tipine serialize ederek AutoHistory tablosuna insert eder. Silmeniz durumunda tüm kolonları Json serialize ederek AutoHistory tablosuna insert eder. Şimdi geçelim bu kütüphanenin entegre edilip kullanılmasına.

Öncelikle

Install-Package Microsoft.EntityFrameworkCore.AutoHistory

Komutu ile kütüphaneyi projemize dahil ediyoruz.

Sonrasında DbContext sıfımızın OnModelCreating methodunda modelBuilder nesnemize EnableAutoHistory(null) methodunu dahil ediyoruz. Eğer buraya null verirseniz default olarak kolon bazlı Varsayılan 2048 tane değişikliği dahil eder. İsterseniz artırıp azaltabilirsiniz ama bence default değeri gayet yeterli.

Sıra AutoHistory tablomuzu oluşturmaya geldi sql scriptini aşağıdaki gibi paylaşıyorum

CREATE TABLE [dbo].[AutoHistory](

       [Id] [int] IDENTITY(1,1) NOT NULL,

       [RowId] [nvarchar](max) NULL,

       [TableName] [nvarchar](max) NULL,

       [Changed] [nvarchar](max) NULL,

       [Kind] [int] NULL,

       [Created] [datetime] NULL,

 CONSTRAINT [PK_AutoHistory] PRIMARY KEY CLUSTERED

(

       [Id] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

Id : Pk alanı identity artan

RowId : işlem yapılan tablonun pk kolonunun değeri

TableName : işlem yapılan tablo adı

Changed : değişiklik olan verilerin json olaran tutulduğu alan

Kind : ne tür değişiklik olduğu

Created : oluşturulma tarihi

 

Tablomuza oluşturduğumuza göre sıra geldi kullanımımıza. SaveChanges işlemi gerçekleşmeden önce EnsureAutoHistory() methodunu dahil etmeniz gerekmektedir. Eğer mimarinizde UnitOfWork kullanıyor iseniz bu methodu sadece orada uygulamanız yeterli olacaktır. User adında tablomuza ben 1 tane kayıt eklemiştim ve şimdi o kayıt üzerinde Name alanını güncelleiyorum.

Şuanda tablodaki verilerim bu şekilde

 

Console uygulamamızı çalıştırdıktan sonraki tablo verilerimiz aşağıdaki gibi oluyor.

AutoHistory tablomuza yapılan değişikliğin geldiğini gördük. Yukarıda bahsettiğim gibi serialize edilen json verimizi inceleyelim.

Değiştirilen kolonun önceki ve sonraki hallerini tutuyor.

Şimdi iki kolonu birden güncelleyelim

Bu sefer değişen iki kolonunda önceki ve sonraki verilerini tuttuğunu görüyoruz.

Şimdi ise bu kaydı silelim.

Kaydı sildiğimiz için tüm kolonların sol halini json olarak tuttuğunu görüyoruz.

AutoHistory tablomuzun sınıfı

İşlem tipinin tutulduğu enum

Gördüğünüz gibi çok kısa bir işlem ile tüm tablolarımızın history lerini verileri ile beraber tutabiliyor.

 

GitHub

Umarım faydalı bir makale olmuştur.
Hepinize kolay gelsin iyi çalışmalar

 

Yorum yaz

Thanks, your message is sent successfully.