Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Sorgulama veritabanından veri okumanıza olanak sağlarken, verileri kaydetmek veritabanına yeni varlıklar eklemek, varlıkları kaldırmak veya mevcut varlıkların özelliklerini bir şekilde değiştirmek anlamına gelir. Entity Framework Core (EF Core), verileri veritabanına kaydetmeye yönelik iki temel yaklaşımı destekler.
Yaklaşım 1: değişiklik izleme ve Değişiklikleri Kaydet
Birçok senaryoda, programınızın veritabanındaki bazı verileri sorgulaması, üzerinde bazı değişiklikler yapması ve bu değişiklikleri geri kaydetmesi gerekir; bu bazen "çalışma birimi" olarak adlandırılır. Örneğin, bir dizi Blog'unuza sahip olduğunuzu ve bunlardan birinin özelliğini değiştirmek Url istediğinizi varsayalım. EF'te bu genellikle aşağıdaki gibi yapılır:
using (var context = new BloggingContext())
{
var blog = await context.Blogs.SingleAsync(b => b.Url == "http://example.com");
blog.Url = "http://example.com/blog";
await context.SaveChangesAsync();
}
Yukarıdaki kod aşağıdaki adımları gerçekleştirir:
- Veritabanından bir varlık yüklemek için normal bir LINQ sorgusu kullanır (bkz . Sorgu verileri). EF'nin sorguları varsayılan olarak izlenir; yani EF, iç değişiklik izleyicisindeki yüklü varlıkları izler.
- Yüklenen varlık örneği, bir .NET özelliği atanarak her zamanki gibi değiştirilir. EF bu adıma dahil değildir.
- Son olarak, DbContext.SaveChanges() çağrılır. Bu noktada EF, varlıkları yüklendikleri andan itibaren bir anlık görüntüyle karşılaştırarak değişiklikleri otomatik olarak algılar. Algılanan değişiklikler veritabanında kalıcı hale gelir; ilişkisel veritabanı kullanılırken, bu genellikle ilgili satırları güncelleştirmek için sql
UPDATEgöndermeyi içerir.
Yukarıdaki bölümde mevcut veriler için tipik bir güncelleştirme işlemi açıklanmıştır, ancak benzer ilkelerin varlık ekleme ve kaldırma için de geçerli olduğunu unutmayın.
DbSet<TEntity>.Add ve Remove çağrıldığında değişikliklerin izlenmesine neden olarak EF'nin değişiklik izleyicisiyle etkileşim kurarsınız. EF, SaveChanges() çağrıldığında (örn. SQL INSERT ve DELETE ilişkisel veritabanı kullanarak) izlenen tüm değişiklikleri veritabanına uygular.
SaveChanges() aşağıdaki avantajları sunar:
- Hangi varlıkların ve özelliklerin değiştiğini izlemek için kod yazmanız gerekmez. EF bunu sizin için otomatik olarak yapar ve yalnızca veritabanındaki bu özellikleri güncelleştirerek performansı artırır. Yüklenen varlıklarınızın kullanıcı arabirimi bileşenine bağlı olup olmadığını ve kullanıcıların istedikleri özelliği değiştirmesine izin verilip veremediğini düşünün; EF, gerçekte hangi varlıkların ve özelliklerin değiştirildiğini anlama yükünü ortadan kaldırır.
- Değişiklikleri veritabanına kaydetmek bazen karmaşık olabilir! Örneğin, bir Blog ve bu blog için bazı gönderiler eklemeyi istiyorsanız, gönderileri ekleyebilmeniz için önce eklenen Blog için veritabanı tarafından oluşturulan anahtarı getirmeniz gerekebilir (çünkü gönderilerin blogu referans almaları gerektiğinden). EF tüm bunları sizin için yapar ve karmaşıklığı ortadan kaldırır.
- EF, sorgunuz ile SaveChanges()arasında bir veritabanı satırının başka biri tarafından değiştirildiği durumlar gibi eşzamanlılık sorunlarını algılayabilir. Eşzamanlılık çakışmalarında daha fazla ayrıntı bulunabilir.
- Bunu destekleyen veritabanlarında, SaveChanges() bir işlemdeki birden çok değişikliği otomatik olarak sarmalar ve bir hata oluştuğunda verilerinizin tutarlı kalmasını sağlar. İşlemler bölümünde daha fazla ayrıntı bulabilirsiniz.
- SaveChanges() ayrıca birçok durumda birden çok değişikliği toplu işleyerek veritabanı gidiş dönüş sayısını önemli ölçüde azaltır ve performansı büyük ölçüde geliştirir. Daha ayrıntılı bilgi için bkz. Verimli güncelleştirme.
Temel SaveChanges() kullanım hakkında daha fazla bilgi ve kod örnekleri için bkz. Temel SaveChanges. EF'nin değişiklik izlemesi hakkında daha fazla bilgi için bkz . Değişiklik izlemeye genel bakış.
Yaklaşım 2: ExecuteUpdate ve ExecuteDelete ("toplu güncelleştirme")
Değişiklik izleme ve SaveChanges() değişiklikleri kaydetmenin güçlü bir yolu olsa da, bazı dezavantajları vardır.
İlk olarak, SaveChanges() değiştireceğiniz veya sileceğiniz tüm varlıkları sorgulamanızı ve izlemenizi gerektirir. Derecelendirmesi belirli bir eşiğin altında olan tüm Blogları silmeniz gerekiyorsa, potansiyel olarak çok fazla sayıda satırı sorgulamanız, somutlaştırmanız, takip etmeniz ve her biri için bir SaveChanges() deyimi oluşturması için DELETE'ye sahip olmanız gerekir. İlişkisel veritabanları çok daha verimli bir alternatif sağlar: tek bir DELETE komut gönderilebilir ve bir WHERE yan tümce aracılığıyla hangi satırların silineceğini belirtebilir, ancak SaveChanges() model bunu oluşturmaya izin vermez.
Bu "toplu güncelleştirme" senaryosını desteklemek için aşağıdaki gibi kullanabilirsiniz ExecuteDelete :
context.Blogs.Where(b => b.Rating < 3).ExecuteDelete();
Bu, normal LINQ sorgusuna benzer şekilde normal LINQ işleçleri aracılığıyla sql DELETE deyimini ifade etmenizi sağlar ve bu da veritabanında aşağıdaki SQL'in yürütülmesine neden olur:
DELETE FROM [b]
FROM [Blogs] AS [b]
WHERE [b].[Rating] < 3
Bu, veritabanından veri yüklemeden veya EF'nin değişiklik izleyicisini içermeden veritabanında çok verimli bir şekilde yürütülür. Benzer şekilde, ExecuteUpdate bir SQL UPDATE deyimini ifade etmenizi sağlar.
Varlıkları toplu olarak değiştirmeseniz bile, hangi varlığın özelliklerini değiştirmek istediğinizi tam olarak biliyor olabilirsiniz. Değişikliği gerçekleştirmek için değişiklik izleme API'sini kullanmak aşırı karmaşık olabilir. Bu, bir varlık örneği oluşturmayı, Attach aracılığıyla bu varlığı izlemeyi, değişikliklerinizi yapmayı ve nihayetinde SaveChanges() çağrısı yapmayı gerektirir. Bu tür senaryolar ExecuteUpdate için ve ExecuteDelete aynı işlemi ifade etmenin çok daha basit bir yolu olabilir.
Son olarak, hem değişiklik izleme hem SaveChanges() de kendisi belirli bir çalışma zamanı yükü getirir. Yüksek performanslı bir uygulama yazıyorsanız, ExecuteUpdate ve ExecuteDelete size bu iki bileşenden de kaçınarak istediğiniz deyimi verimli bir şekilde oluşturma imkanı verir.
Ancak ExecuteUpdate ve ExecuteDelete'in de belirli sınırlamaları olduğunu unutmayın.
- Bu yöntemler hemen yürütülür ve şu anda diğer işlemlerle toplu işlenemez. Öte yandan , SaveChanges()birden çok işlemi birlikte toplu işleyebilir.
- Değişiklik izleme söz konusu olmadığından, tam olarak hangi varlıkların ve özelliklerin değiştirilmesi gerektiğini bilmek sizin sorumluluğunuzdadır. Bu, değiştirilmesi gerekenleri ve değişmeyenleri izlemek için daha fazla el ile, düşük seviyeli kode ihtiyaç duyulabileceği anlamına gelebilir.
- Buna ek olarak, değişiklik izleme söz konusu olmadığından, bu yöntemler değişiklikleri kalıcı hale getirirken Eşzamanlılık Denetimi'ne otomatik olarak uygulanmaz. Ancak, eşzamanlılık denetimini kendiniz uygulamak için yine de açıkça bir
Whereyan tümce ekleyebilirsiniz. - Şu anda yalnızca güncelleştirme ve silme desteklenmektedir; ekleme işlemi ve DbSet<TEntity>.Addaracılığıyla SaveChanges() yapılmalıdır.
Daha fazla bilgi ve kod örnekleri için bkz ExecuteUpdate . ve ExecuteDelete.
Özet
Hangi yaklaşımın ne zaman kullanılacağına ilişkin birkaç yönerge aşağıdadır. Bunların mutlak kurallar olmadığını, ancak yararlı bir temel kurallar sağladığını unutmayın:
- Hangi değişikliklerin gerçekleştirileceğini önceden bilmiyorsanız kullanın
SaveChanges; hangi değişikliklerin uygulanması gerektiğini otomatik olarak algılar. Örnek senaryolar:- "Veritabanından bir Blog yüklemek ve kullanıcının değiştirmesine izin veren bir form görüntülemek istiyorum"
- Bir nesne grafını (birbirine bağlı birden çok nesne) işlemeniz gerekiyorsa kullanın
SaveChanges; değişikliklerin doğru sıralanması ve her şeyin birbirine nasıl bağlanacağını belirler.- "Blogu güncelleştirmek, bazı gönderilerini değiştirmek ve diğerlerini silmek istiyorum"
- Bazı ölçütlere göre çok sayıda varlığı değiştirmek istiyorsanız,
ExecuteUpdateveExecuteDeletekullanın. Örnek senaryolar:- "Tüm çalışanlara zam yapmak istiyorum"
- "Adı X ile başlayan tüm blogları silmek istiyorum"
- Eğer hangi varlıkları değiştirmek istediğinizi ve bunları nasıl değiştirmek istediğinizi zaten biliyorsanız,
ExecuteUpdateveExecuteDeletekullanın. Örnek senaryolar:- "Adı 'Foo' olan blogu silmek istiyorum"
- Bloğun ID'si 5 olan adını 'Bar' olarak değiştirmek istiyorum.