EF

2013-08-04 5 views
0

의 레코드를 업데이트 할 때 먼저 asp.net mvc 프로젝트에서 EF 코드를 사용하고 있습니다. 모든 테이블에 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에서 이러한 작업을 수행 할 수 있습니까?

+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; 
    } 
}