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.
Tavsiye
Olay örneğini GitHub'dan indirebilirsiniz.
Entity Framework Core (EF Core), EF Core kodunda bazı şeyler gerçekleştiğinde geri çağırma görevi görmesi için .NET olaylarını kullanıma sunar. Olaylar önleyicilerden daha basittir ve daha esnek bir kayıt imkanı sunar. Ancak, bunlar yalnızca senkron olduğundan bloklanmayan asenkron G/Ç gerçekleştiremez.
Olaylar her DbContext örneği için kaydedilir. Aynı bilgileri almak için ancak işlemdeki tüm DbContext örnekleri için bir tanılama dinleyicisi kullanın.
EF Core tarafından tetiklenen olaylar
Aşağıdaki olaylar EF Core tarafından tetiklenir:
| Etkinlik | Yükseltildiğinde |
|---|---|
| DbContext.SavingChanges | SaveChanges veya SaveChangesAsync başında |
| DbContext.SavedChanges | Başarılı bir SaveChanges veya SaveChangesAsync sonunda |
| DbContext.SaveChangesFailed | Başarısız bir SaveChanges veya SaveChangesAsync sonunda |
| ChangeTracker.Tracked | Bir varlık, bağlam tarafından takip edildiğinde |
| ChangeTracker.StateChanged | İzlenen varlık durumunu değiştirdiğinde |
Örnek: Zaman damgası durumu değişiklikleri
DbContext tarafından izlenen her varlığın bir EntityStatevardır. Örneğin, Added durumu varlığın veritabanına ekleneceğini belirtir.
Bu örnekte, bir varlığın durum değişikliğini algılamak için Tracked ve StateChanged olayları kullanılır. Ardından varlığı, bu değişikliğin ne zaman gerçekleştiğini belirten geçerli saatle damgalar. Bu, varlığın ne zaman eklendiğini, silindiğini ve/veya son güncelleştirildiğini gösteren zaman damgalarıyla sonuçlanır.
Bu örnekteki varlık türleri zaman damgası özelliklerini tanımlayan bir arabirim uygular:
public interface IHasTimestamps
{
DateTime? Added { get; set; }
DateTime? Deleted { get; set; }
DateTime? Modified { get; set; }
}
Uygulamanın DbContext üzerindeki bir yöntem daha sonra bu arabirimi uygulayan herhangi bir varlık için zaman damgaları ayarlayabilir:
private static void UpdateTimestamps(object sender, EntityEntryEventArgs e)
{
if (e.Entry.Entity is IHasTimestamps entityWithTimestamps)
{
switch (e.Entry.State)
{
case EntityState.Deleted:
entityWithTimestamps.Deleted = DateTime.UtcNow;
Console.WriteLine($"Stamped for delete: {e.Entry.Entity}");
break;
case EntityState.Modified:
entityWithTimestamps.Modified = DateTime.UtcNow;
Console.WriteLine($"Stamped for update: {e.Entry.Entity}");
break;
case EntityState.Added:
entityWithTimestamps.Added = DateTime.UtcNow;
Console.WriteLine($"Stamped for insert: {e.Entry.Entity}");
break;
}
}
}
Bu yöntem, hem Tracked hem de StateChanged olayları için olay işleyicisi olarak kullanılacak uygun imzaya sahiptir. İşleyici, DbContext oluşturucusunda her iki olay için de kaydedilir. Olayların herhangi bir zamanda dbContext'e eklenebileceğini unutmayın; bunun bağlam oluşturucusunda gerçekleşmesi gerekli değildir.
public BlogsContext()
{
ChangeTracker.StateChanged += UpdateTimestamps;
ChangeTracker.Tracked += UpdateTimestamps;
}
Yeni varlıklar ilk kez izlendiğinde Tracked olaylarını tetiklediğinden her iki olay da gereklidir.
StateChanged olaylar, yalnızca zaten izlenmekte olan varlıkların durumu değiştirirken tetiklenir.
Bu örneğe ilişkin örnek , blog veritabanında değişiklik yapan basit bir konsol uygulaması içerir:
using (var context = new BlogsContext())
{
await context.Database.EnsureDeletedAsync();
await context.Database.EnsureCreatedAsync();
context.Add(
new Blog
{
Id = 1,
Name = "EF Blog",
Posts = { new Post { Id = 1, Title = "EF Core 3.1!" }, new Post { Id = 2, Title = "EF Core 5.0!" } }
});
await context.SaveChangesAsync();
}
using (var context = new BlogsContext())
{
var blog = await context.Blogs.Include(e => e.Posts).SingleAsync();
blog.Name = "EF Core Blog";
context.Remove(blog.Posts.First());
blog.Posts.Add(new Post { Id = 3, Title = "EF Core 6.0!" });
await context.SaveChangesAsync();
}
Bu kodun çıktısı, gerçekleşen durum değişikliklerini ve uygulanan zaman damgalarını gösterir:
Stamped for insert: Blog 1 Added on: 10/15/2020 11:01:26 PM
Stamped for insert: Post 1 Added on: 10/15/2020 11:01:26 PM
Stamped for insert: Post 2 Added on: 10/15/2020 11:01:26 PM
Stamped for delete: Post 1 Added on: 10/15/2020 11:01:26 PM Deleted on: 10/15/2020 11:01:26 PM
Stamped for update: Blog 1 Added on: 10/15/2020 11:01:26 PM Modified on: 10/15/2020 11:01:26 PM
Stamped for insert: Post 3 Added on: 10/15/2020 11:01:26 PM