2013-08-04 64 views
0

我在我的asp.net mvc項目中首先使用EF代碼。我想要每個表中的updated_at(DateTime)列。所以,如果我更新記錄,我希望列值設置爲當前日期時間。更新EF中的記錄

public abstract class User 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    [Required] 
    public string name { get; set; } 
    [Required] 
    public string email { get; set; } 
    [Required] 
    public string password { get; set; } 

    private DateTime _created_at; 
    private DateTime _updated_at; 

    public User() 
    { 
     _created_at = DateTime.Now; 
     _updated_at = DateTime.Now; 
    } 

    public virtual DateTime created_at 
    { 
     get 
     { 
      return this._created_at; 
     } 
    } 

    public virtual DateTime updated_at 
    { 
     get 
     { 
      return this._updated_at; 
     } 
    } 
} 

如何在不直接在數據庫中寫入TRIGGER的情況下在EF中實現這一點。

+2

http://stackoverflow.com/questions/2097947/entity-framework-setting-update-timestamp – zsong

+0

您使用的虛擬無助的例子 –

回答

3

在您DbContext構造函數中使用如下:

public MyDbContext() 
{ 
    ((IObjectContextAdapter)this).ObjectContext.SavingChanges += ObjectContext_SavingChanges; 
} 

void ObjectContext_SavingChanges(object sender, EventArgs e) 
{ 
    // Ensure that we are passed an ObjectContext 
    ObjectContext context = sender as ObjectContext; 
    if (context != null) 
    { 
     // Set DateTime to UTC when 
     foreach (ObjectStateEntry entry in 
      context.ObjectStateManager.GetObjectStateEntries(
      EntityState.Modified)) 
     { 
      if (entry.Entity.GetType().GetProperty("_updated_at") != null) 
      { 
       dynamic entity = entry.Entity; 
       entity._updated_at = DateTime.UtcNow; 
       DateTime.SpecifyKind(entity._updated_at, DateTimeKind.Utc); 
      } 
     } 
    } 
} 
+0

我_updated_at財產是私有的。它可以從外面訪問嗎? – Rajagopal

+0

如果您在同一個程序集中有模型和上下文,您可以將'_update_at'設置爲'internal',以便它可以編寫它。 – sergioadh

+0

一個接口將是一個更好的方法。 –

0

要如何處理類中的時間戳信息,您應該使用一個接口來定義。你可以對許多不同的東西使用相同的技巧。

public interface ITimeStampable 
{ 
    DateTime created_at {get; set;} 
    DateTime updated_at {get; set;} 
} 

public class User : ITimeStampable 
{ 
    public User(){ 
     created_at = DateTime.Now; 
     updated_at = DateTime.Now; 
    } 
    public DateTime created_at {get; set;} 
    public DateTime updated_at {get; set;} 
} 

void ObjectContext_SavingChanges(object sender, EventArgs e) 
{ 
    var context = sender as ObjectContext; 

    foreach (ObjectStateEntry entry in 
     context.ObjectStateManager.GetObjectStateEntries(
     EntityState.Modified)) 
    { 
     if (typeof(IAuditable).IsAssignableFrom(entry.Entity.GetType())) 
       (entity as IAuditable).ChangeTS = DateTime.Now; 
    } 
}