• 1 odgovor
  • 2.140 pregleda
Entity framework 6 - datum u UTC 14.06.2014. u 11:56 · pre 150 meseci #1
Kako najlakše implementirati da se svi datumi u EF6 snimaju kao UTC vreme?
Mogao bih da za svaki entity lično postavim datum sa ToUniversalTime(), ali mi to deluje suviše komplikovano i podložno greškama.
Postoji li neki centralizovani način da se svi datumi snime i čitaju kao UTC vremena?

Poz.
Potpis
Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
Re: Entity framework 6 - datum u UTC 14.06.2014. u 14:57 · pre 150 meseci #2
Našao sam rešenje, ali me zanima koliko će ovo usporiti aplikaciju

Code (csharp):

public class DBContext : EFEntities
    {
        public DBContext()
            : base()
        {

            ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += ObjectContext_ObjectMaterialized;
            ((IObjectContextAdapter)this).ObjectContext.SavingChanges += ObjectContext_SavingChanges;

        }

        private void ObjectContext_SavingChanges(object sender, EventArgs e)
        {
            ObjectContext context = sender as ObjectContext;
            if (context != null)
            {
                foreach (ObjectStateEntry entry in
                              context.ObjectStateManager.GetObjectStateEntries(
                              EntityState.Added | EntityState.Modified))
                {

                    foreach (var item in entry.Entity.GetType().GetProperties())
                    {
                        if (item.PropertyType == typeof(DateTime))
                        {
                            DateTime date = (DateTime)item.GetValue(entry.Entity);
                            date = date.ToUniversalTime();
                            item.SetValue(entry.Entity, date);
                            continue;
                        }

                        if (item.PropertyType == typeof(Nullable<DateTime>))
                        {
                            Nullable<DateTime> date = (DateTime)item.GetValue(entry.Entity);
                            if (date.HasValue)
                            {
                                date = date.Value.ToUniversalTime();
                                item.SetValue(entry.Entity, date);
                            }
                        }
                    }
                }
            }
        }

        private void ObjectContext_ObjectMaterialized(object sender, System.Data.Entity.Core.Objects.ObjectMaterializedEventArgs e)
        {
            foreach (var item in e.Entity.GetType().GetProperties())
            {
                if (item.PropertyType == typeof(DateTime))
                {
                    DateTime date = (DateTime)item.GetValue(e.Entity);
                    date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
                    item.SetValue(e.Entity, date);
                    continue;
                }

                if (item.PropertyType == typeof(Nullable<DateTime>))
                {
                    Nullable<DateTime> date = (DateTime)item.GetValue(e.Entity);
                    if (date.HasValue)
                    {
                        date = DateTime.SpecifyKind(date.Value, DateTimeKind.Utc);
                        item.SetValue(e.Entity, date);
                    }
                }
            }
        }
    }


Rešenje je da prilikom snimanja u bazu prolazim kroz sve property-e svih entity-a i ukoliko je isti tipa DateTime ili Nullable<DateTime> snimam UTC vrednost datuma.
Sa druge strane kad čitam samo postavljam da je tip pročitanog datuma UTC.

Postoji li neko bolje rešenje?
Potpis
Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme