2016-09-09 1 views
2

ASP.NET MVC 5를 사용하여 응용 프로그램을 작성하고 있습니다. 데이터베이스에 저장하려고하는 모든 datetime을 로컬 표준 시간대에서 UTC 표준 시간대로 먼저 변환해야합니다.Entity Framework에서 저장시 datetime 필드를 UTC로 자동 변환 할 수 있습니까?

요청주기 중 가장 적합한 장소는 어디인지 알 수 없습니다.

ViewModel 규칙을 통과 한 후 컨트롤러에서 각 필드를 UTC로 변환 할 수 있습니다. 그러나 나는 이것이 너무 많은 코드/단계라고 생각합니다.

Entity Framework에서 변경 사항을 저장하기 전에 datetime을 UTC로 자동 변환하는 규칙을 추가 할 수있는 방법이 있습니까?

날 전에 자동으로 UTC로 날짜를 변환하는 규칙을 추가 할 수 엔티티 프레임 워크의 방법 나는 그 UTC

public static DateTime? ConvertToUTC(DateTime? val, TimeZoneInfo destinationTimeZone = null) 
{ 
     if (val != null) 
     { 
      var dateTimeToConvert = ConvertToDateTime(val); 

      if (destinationTimeZone == null) 
      { 
       if (ConfigurationManager.AppSettings["LocalTimeZone"] != null) 
       { 
        destinationTimeZone = TimeZoneInfo.FindSystemTimeZoneById(ConfigurationManager.AppSettings["LocalTimeZone"]); 
       } 
       else 
       { 
        destinationTimeZone = TimeZoneInfo.FindSystemTimeZoneById(TimeZone.CurrentTimeZone.StandardName); 
       } 
      } 
      return TimeZoneInfo.ConvertTimeFromUtc(dateTimeToConvert, destinationTimeZone); 

     } 

     return null; 
} 
+0

가장 좋은 장소는 클라이언트에서 수행하는 것입니다. 클라이언트 만 자신이 속한 시간대를 알고 있으며 클라이언트가 UTC 또는 DateTimeOffset 유형으로 날짜 시간을 보내야합니다. 서버에서 수행하지 마십시오. 모든 클라이언트가 서버와 동일한 시간대 (* 인트라넷 웹 응용 프로그램에서 작동 할 수 있음)에서 실행 중이라고가 정할 수 없다면 너무 늦은 것입니다. datetime을 보내고 클라이언트에 UTC로 보내고 클라이언트가 로케일로 변환하도록합니다. 이것을 잘 처리하는 클라이언트 측 라이브러리가 있습니다. – Igor

+0

사용자 프로필에서 사용자의 현지 시간대를 알고 있습니다. 모든 것은 그것에서 파생됩니다. – Jaylen

+0

사용자가 여행하나요? 사용자 Bob이 뉴욕에서 L.A로 여행하면 어떻게됩니까? 그리고 나서 Bob은 속성으로 DateTime을 가진 DB에 무엇인가 커밋하거나 DateTime 속성을 가진 무언가를 검색합니까? Bob이 전에 자신의 시간대 정보를 업데이트했는지 확인해야합니다. 어쩌면 Bob이 새로운 시간대로 이동하면 작동하지만, Bob이 다른 시간대를 자주 방문하는 여행자 인 경우 관리가 어려워집니다. – Igor

답변

1

에주는 날짜를 변환합니다 쓴 방법이있다 변경 사항을 저장 하시겠습니까?

DbContext에서 호출되기 전에 SaveChanges/SaveChangesAsync 메서드를 재정의하고 변환을 실행할 수 있습니다.

// on your DbContext type 

public override int SaveChanges(){ 
    DateTimeUtcHelper.SetDatesToUtc(this.ChangeTracker.Entries()); 
    return base.SaveChanges(); 
} 

class DateTimeUtcHelper{ 
    internal static void SetDatesToUtc(IEnumerable<DbEntityEntry> changes) { 
     foreach (var dbEntry in changes.Where(x => ChangesToTrackList.Contains(new[] {EntityState.Added, EntityState.Modified}))){ 
      foreach (var propertyName in dbEntry.CurrentValues.PropertyNames){ 

       // using reflection add logic to determine if its a DateTime or nullable DateTime 
       // && if its kind = DateTimeKind.Local or Unspecified 
       // and then convert set the Utc value 
       // and write it back to the entry using dbEntry.CurrentValues[propertyName] = utcvalue; 

      } 
     } 
    } 
} 

당신은 (예. 기본적으로 구체화 날짜 시간이이 있는지 확인 사용자로부터 오지 않은 당신이 변화의 날짜 시간을 변경하는 인스턴스가없는 확인하기 위해 자신의 논리를 추가해야 DateTimeKind.Utc 플래그 설정 또는 사용자가 변경할 경우 .Local).


편집

DbContext 사용자가 당신이 통과 할 수 있도록 아마도 SaveChanges를의 과부하가 더 적합 할 것이다.에서 실행되고 있는지 그 요청 컨텍스트 프로파일에 또한 시간대에 액세스해야하는 것 또는 DI를 사용하고 있다면 아마도 생성 된 DbContext에 DI를 삽입 할 수 있습니다.

+0

ChangesToTrackList가 정의되지 않았습니다. – Talon

관련 문제