Csharp/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.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/959990.html

(0)
上一篇 2021年11月24日
下一篇 2021年11月24日

精彩推荐