İçeriğe geç

EntityFramework İçinde SqlTransaction Kullanımı

Veritabanı uygulamaları için transaction kavramı çoğu zaman önemsenmemektedir. Fakat uygulamanın veri güvenliğini sağlamak adına önemlidir. Aynı anda bir biri ile ilişkili olan tablolara kayıt eklememiz olasıdır ve bu esnada hata ile karşılaşıldığında veritabanındaki veriler tutarsızlık gösterecektir.

System.Data.SqlClient isim uzayı altında bulunan SqlTransaction nesnesi bu noktada ihtiyacımızı karşılayacaktır. EntityFramework (CodeFirst) ile basit bir senaryo oluşturarak test edebiliriz. Senaryo gereği bir tane Product nesnemiz ve bir tane de Category nesnemiz olsun. Aynı anda her iki tablo için de kayıt eklemeyi deneyelim.

İlk etap için veritabanı bağlantısını sağlayacağımız bir connectionstring için property oluşturabiliriz.

        public static string DbConnectionString
        {
            get
            {
                return ConfigurationManager
                        .ConnectionStrings["ProductContextConn"]
                        .ConnectionString;
            }
        }

Şimdi hazırlayacağımız bir test metodumuzun içine ihtiyacımız olan SqlConnection nesnesini ve SqlTransaction nesnemizi hazırlayabiliriz.

SqlConnection conn = new SqlConnection(DbConnectionString);
            conn.Open();
            SqlTransaction sqlTransaction = conn.BeginTransaction();

Şu aşamada veritabanı bağlantısını sağlayacağımız connection nesnesimiz ve transaction işlemi gerçekleştirebileceğimiz nesnemiz hazır. Artık veritabanı işlemlerini gerçekleştirebileceğimiz context nesnesi hazırlamamız gerekli ve bu nesnemize hazırladığımız transaction nesnesini kullanacağını belirtmemiz gerekecek.

                ProductContext context = new ProductContext(conn, false);
                context.Database.UseTransaction(sqlTransaction);

Şimdi yukarıdaki belirtilen veritabanındaki tablolara karşılık gelen 2 nesnemizi kullanaraktan insert işlemi gerçekleştirebiliriz. Burada her ne kadar context.SaveChanges(); diyor olsak bile biz transaction nesnemizi kullanarak commit işlemi yapana kadar veritabanına kayıt eklemeyecektir.

                #region Category Add
                Category category = new Category() { Name = "Electronic" };
                context.Categories.Add(category);
                context.SaveChanges();
                #endregion

                #region Product Add
                Product product = new Product() { Name = "Apple iPad Air 16GB", ProductType = "MD788TU/A" };
                context.Products.Add(product);
                context.SaveChanges();
                #endregion

                //İşlem tamamlanıyor.
                sqlTransaction.Commit();

İlgili tablolarımıza kayıt ekleme esnasında hata ile karşılaştığımız durumda transaction nesnemizi kullanarak Rollback yapmak durumundayız ki bu işlem verilerin veritabanındaki tablolara yansımasını engelleyecektir(try cactch bloğu içinde kullanılabilir).

sqlTransaction.Rollback();

Yüzeysel olarak genel manada transaction kullanımını örnekle incelemeye çalıştık. Örnek olarak verilen kodları proje içinde incelemek için şuradaki linkten projeyi indirebilirsiniz. Mutlu kodlamalar dilerim.

Tarih:Entity Framework

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.