2011-07-13 56 views
12

下面我創建了一個演示實體來證明什麼,我找前呼籲實體的方法:在實體框架,如何節約

public class User : IValidatableObject 
{ 
    public string Name { get; set; } 

    [Required] 
    public DateTime CreationDate { get; set; } 

    public DateTime UpdatedOnDate { get; set; } 

    public IEnumerable<ValidationResult> 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(); 

蔭規劃轉向內部Useru.CreationDate=DateTime.Now;代碼。和實施提供了將要執行的方法保存之前和驗證

// 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<User>(this).State == System.Data.EntityState.Added) 
     { 
      //add creation date_time 
      this.CreationDate=DateTime.Now; 

      //SET MORE DEFAULTS 
     } 

     if(dataContext.Entry<User>(this).State == System.Data.EntityState.Modified) 
     { 
      //update Updation time 
      this.UpdatedOnDate = DateTime.Now; 
     } 
    } 
} 

現在創建一個新的用戶我只需要如下做後的界面,請注意,我沒有添加日期屬性這個時候,類自動執行。

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

要更新的用戶,UpdatedOnDate屬性將自動被類更新

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

我的問題:是否有任何現有的接口,提供 一些方法得到SaveAfterValidate或一些之前調用其他的做法,我可能不知道。或者,如果我創建了我的自定義界面,我怎麼能讓它的方法以我想要的順序執行。

+0

你可能想看看SavingChanges事件:http://msdn.microsoft.com/en-us/library/cc716714.aspx – Yakimych

+0

我ahve已經看到,但沒有做什麼亞姆尋找。 –

回答

19

我有一個幾乎相同的情況,我通過處理上下文中的SavingChanges事件來管理它。

首先我創建定義時間戳操作的接口:

public interface IHasTimeStamp 
{ 
    void DoTimeStamp(); 
} 

然後我實現這個接口在我的實體:

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

     if(dataContext.Entry<User>(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(); 
      } 
     } 
    } 
} 
+0

幹得好!給予好評。可能是我的答案和路要走。 –

+4

這正是我所需要的,但困惑在哪裏MyEntities假設是?那是DbContext類嗎?我希望我可以在我的Web項目中連接這個事件以保持邏輯,而不是我的EF層。謝謝! – loyalflow

+0

EF7/Core尚未支持。 –