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?