Ահա մի մոտեցում, որը դուք կարող եք դիտարկել.
Նախ, սահմանեք այս հատկանիշը.
[AttributeUsage(AttributeTargets.Property)]
public class DateTimeKindAttribute : Attribute
{
private readonly DateTimeKind _kind;
public DateTimeKindAttribute(DateTimeKind kind)
{
_kind = kind;
}
public DateTimeKind Kind
{
get { return _kind; }
}
public static void Apply(object entity)
{
if (entity == null)
return;
var properties = entity.GetType().GetProperties()
.Where(x => x.PropertyType == typeof(DateTime) || x.PropertyType == typeof(DateTime?));
foreach (var property in properties)
{
var attr = property.GetCustomAttribute<DateTimeKindAttribute>();
if (attr == null)
continue;
var dt = property.PropertyType == typeof(DateTime?)
? (DateTime?) property.GetValue(entity)
: (DateTime) property.GetValue(entity);
if (dt == null)
continue;
property.SetValue(entity, DateTime.SpecifyKind(dt.Value, attr.Kind));
}
}
}
Այժմ միացրեք այդ հատկանիշը ձեր EF համատեքստին.
public class MyContext : DbContext
{
public DbSet<Foo> Foos { get; set; }
public MyContext()
{
((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized +=
(sender, e) => DateTimeKindAttribute.Apply(e.Entity);
}
}
Այժմ ցանկացած DateTime
կամ DateTime?
հատկությունների վրա կարող եք կիրառել այս հատկանիշը՝
public class Foo
{
public int Id { get; set; }
[DateTimeKind(DateTimeKind.Utc)]
public DateTime Bar { get; set; }
}
Այս դեպքում, երբ Entity Framework-ը բեռնում է էությունը տվյալների բազայից, այն կսահմանի ձեր նշած DateTimeKind
ը, օրինակ՝ UTC:
Այժմ դուք ասացիք, որ ցանկանում եք անցնել DateTimeOffset
տեսակներին: Դուք կարող եք օգտվել այն փաստից, որ DateTime
-ն ունի միակողմանի անուղղակի փոխակերպում DateTimeOffset
ի, որը հաշվի կառնի .Kind
-ը: Այլ կերպ ասած, դուք կարող եք դա անել.
DateTimeOffset BarDTO = foo.Bar;
Չնայած foo.Bar
-ը DateTime
է, սա կաշխատի: Քանի որ տեսակը սահմանված է UTC-ի, օֆսեթը կզրոյի DateTimeOffset
-ում:
Իհարկե, դուք միշտ կարող եք դա անել ձեր մոդելում հետևյալ կերպ.
[NotMapped]
public DateTimeOffset BarDTO
{
get { return Bar; }
set { Bar = value.UtcDateTime; }
}
Համոզված եմ, որ դուք կարող եք սրա տատանումները գտնել ձեր կարիքներին համապատասխան: Գլխավորն այն է, որ ինչ հատկություն էլ քարտեզագրվի դաշտին, տեսակը պետք է համապատասխանի:
09.10.2013