在Entity框架中,如何在保存之前调用Entity上的方法

下面我创建了一个演示实体来演示我正在寻找的东西:

public class User : IValidatableObject { public string Name { get; set; } [Required] public DateTime CreationDate { get; set; } public DateTime UpdatedOnDate { get; set; } public IEnumerable Validate(ValidationContext validationContext) { if(Name = "abc") { yield return new ValidationResult("please choose any other name then abc", new[] { "Name" }); } } } 

我正在实现IValidatableObject接口来使这个实体SelfValidating。

现在正在创建新的用户iam这样做

 User u = new User(); u.Name = "Some name"; u.CreationDate = DateTime.Now dbContext.Users.Add(u); dbContext.SaveChanges(); 

我打算转移u.CreationDate=DateTime.Now; User类中的代码。 并实现一个接口,该接口提供将在保存之前和validation之后执行的方法

 // class structure that I am looking for public class User : IValidatableObject,IMyCustomInterFace { //rest codes as above class public void MyMethod(Whatever) { //this method gets called after Validate() and before save if(dataContext.Entry(this).State == System.Data.EntityState.Added) { //add creation date_time this.CreationDate=DateTime.Now; //SET MORE DEFAULTS } if(dataContext.Entry(this).State == System.Data.EntityState.Modified) { //update Updation time this.UpdatedOnDate = DateTime.Now; } } } 

现在要创建一个我只需要做的新用户,请注意我这次没有添加date属性,Class会自动执行。

 User u = new User(); u.Name = "Some name"; dbContext.Users.Add(u); dbContext.SaveChanges(); 

要更新用户, UpdatedOnDate类自动更新UpdatedOnDate属性

 User u = getUserFromSomeWhere(); u.Name = "Updated Name"; dataContext.Entry(u).State = System.Data.EntityState.Modified; dbContext.SaveChanges(); 

我的问题 :是否有任何现有的接口提供了一些在SaveAfterValidate之前调用的方法或其他一些方法,我可能不知道。

或者,如果我创建自定义界面,我如何使其方法按我想要的顺序执行。

我有一个几乎相同的情况,我通过处理上下文中的SavingChanges事件来管理它。

首先,我创建一个定义时间戳操作的接口:

 public interface IHasTimeStamp { void DoTimeStamp(); } 

然后我在我的实体中实现这个接口:

 Public class User : IHasTimeStamp ( public void DoTimeStamp() { if(dataContext.Entry(this).State == System.Data.EntityState.Added) { //add creation date_time this.CreationDate=DateTime.Now; } if(dataContext.Entry(this).State == System.Data.EntityState.Modified) { //update Updation time this.UpdatedOnDate=DateTime.Now; } } } 

最后一步是注册SavingChanges处理程序并实现它。

 public partial class MyEntities { partial void OnContextCreated() { // Register the handler for the SavingChanges event. this.SavingChanges += new EventHandler(context_SavingChanges); } // SavingChanges event handler. private static void context_SavingChanges(object sender, EventArgs e) { // Validate the state of each entity in the context // before SaveChanges can succeed. foreach (ObjectStateEntry entry in ((ObjectContext)sender).ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)) { if (!entry.IsRelationship && (entry.Entity is IHasTimeStamp)) { (entry.Entity as IHasTimeStamp).DoTimeStamp(); } } } }