2013-08-04 4 views
0

Я использую EF-код сначала в моем проекте asp.net mvc. Мне нужен столбец updated_at (DateTime) в каждой таблице. Поэтому, если я обновляю запись, я хочу, чтобы значение столбца было установлено на текущую 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; 
     } 
    } 
} 

Как это сделать в EF без прямого ввода TRIGGER в базу данных.

+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; 
    } 
} 
Смежные вопросы