C#学习教程:是否有可能在插入/更新之前在POCO中执行操作?分享


是否有可能在插入/更新之前在POCO中执行操作?

让我们假设这个entity framework示例:

public class User { public int UserID { get; set; } public string Name { get; set; } } public class MyDbContext : DbContext { public DbSet Users { get; set; } } class Program { static void Main(string[] args) { using (var db = new MyDbContext ()) { var user = new User { Name = "Foo"}; db.Users.Add(user); db.SaveChanges(); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } } } 

我想添加User类事件,比如“BeforeInsert”或“BeforeUpdate”,以及代码时……

 db.Users.Add(user); 

…在应用程序的任何地方执行,将引发“BeforeInsert”方法。 可能吗?

@JC的回答是正确的。 我将只显示代码,您可以在其中执行您想要的操作。 首先,在上下文中覆盖SaveChanges方法,并调用此覆盖SaveChanges方法: context.SaveChanges(true)而不是conntext.SaveChanges()

 public class MyDbContext : DbContext { public DbSet Users { get; set; } public int SaveChanges(bool performCustomOperations) { if(performCustomOperations) { CustomContextManager contextManager = new CustomContextManager(this); //Perform operations you want before saving data contextManager.PerformBeforeUpdate(); //To do: Add your own PerformBeforeInsert method to CustomContextManager class } //Save changes to underlying database this.SaveChanges(); } } 

您的CustomContextManager类应如下所示。 在PerformBeforeUpdate方法中执行更新前操作。 您可以添加自己的PerformBeforeInsert和/或PerformBeforeDelete方法。

 public class CustomContextManager { private MyDbContext context; public CustomContextManager(MyDbContext contextParam) { if (contextParam == null) throw new ArgumentNUllException(nameof(contextParam)); this.context = contextParam; } public void PerformBeforeUpdate { //Get object context to be able to perform operations System.Data.Objects.ObjectContext myObjectContext = ((IObjectContextAdapter)context).ObjectContext; IEnumerable updatedRecords = taxesObjectContext.ObjectStateManager.GetObjectStateEntries( System.Data.EntityState.Modified); if (updatedRecords != null && updatedRecords.Count() > 0) { foreach (ObjectStateEntry stateEntry in updatedRecords) { if (stateEntry != null && stateEntry.Entity != null) { //Do what operations you want instead of below linnes User modifiedUser = stateEntry.Entity as User; if(modifiedUser != null) modifiedUser.Name = "Altered before update"; } } } } } 

您希望在覆盖DbContextSaveChanges()方法时DbContext 。 通过ChangeTracker.Entries集合扫描您的类型的任何条目。 然后,对于其中的每一个,根据entry.StateEntityState.Added还是EntityState.Modified执行BeforeInsert或BeforeUpdate操作。

上述就是C#学习教程:是否有可能在插入/更新之前在POCO中执行操作?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/959990.html

发表评论

邮箱地址不会被公开。 必填项已用*标注